简单工厂(简单工厂不是设计模式而是编程习惯,有些人误以为是“工厂模式”):将共性的算法抽取,进行抽象定义在一个类作为工厂类,工厂类根据参数化方法来实例化对象
工厂方法模式(Factory Mode):定义一个用于创建对象的接口,让子类来决定实例化的类是哪一个。工厂方法将类实例化延迟到子类
抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,无需指定具体类
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
简单工厂和工厂方法之间的差异: 简单工厂将全部的事情放在一个地方处理完;工厂方法创建一个框架,让子类决定要如何实现(将对象实例化延迟到子类), 简单工厂不具备工厂方法的弹性无法变更正在创建的产品
// 产品类
abstract class Car{
public String name;
public String color;
Car(String _name, String _color){
this.name = _name;
this.color = _color;
}
abstract void getInfo();
}
class BenzCar extends Car{
public BenzCar(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车品牌:" + this.name + " ,汽车颜色: " + this.color);
}
}
class BMWCar extends Car{
public BMWCar(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车品牌:" + this.name + " ,汽车颜色: " + this.color);
}
}
// 简单工厂类
class SimpleCarFactory{
/**
* carName: 车名称
* color: 车的颜色
* type: 汽车品牌
*/
@Override
public Car getCar(String carName, String color, String type) { // 参数化工厂方法: 根据传入的参数创建不同的对象
if("Benz".equals(type)){
return new BenzCar(carName, color);
}else if ("BMW".equals(type)){
return new BMWCar(carName, color);
}else{
System.out.println("No matching type!");
return null;
}
}
}
public class FactoryPatterDemoSpace {
public static void main(String[] args) {
SimpleCarFactory carFactory = new SimpleCarFactory();
Car car = carFactory.getCar("奔驰", "黑色", "Benz");
car.getInfo(); // 汽车品牌:奔驰 ,汽车颜色: 黑色
}
}
// 产品类
abstract class Car{
public String name; // 汽车名称
public String color; // 汽车颜色
Car(String _name, String _color){
this.name = _name;
this.color = _color;
}
abstract void getInfo();
}
// 产品具体类
class BenzCarInGermany extends Car{
public BenzCarInGermany(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " ,汽车配置来源:德国????-Germany");
}
}
// 产品具体类
class BenzCarInChina extends Car{
public BenzCarInChina(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " ,汽车配置来源:中国????-China");
}
}
// 产品具体类
class BMWCarInGermany extends Car{
public BMWCarInGermany(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " , 汽车配置来源:德国????-Germany" );
}
}
// 产品具体类
class BMWCarInChina extends Car{
public BMWCarInChina(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " , 汽车配置来源:中国????-China" );
}
}
// 工厂类
interface CarFactory{
Car createCar(String carName, String color, String place);
}
// 工厂子类用来决定实例化对象的类具体是哪一个(工厂方法模式将类实例化延迟到子类)
class BenzCarFactory implements CarFactory{
/**
* @param carName 汽车名称
* @param color 汽车颜色
* @param place 汽车配置来源地
* */
@Override
public Car createCar(String carName, String color, String place) {
if("Germany".equals(place)){
return new BenzCarInGermany(carName, color);
}else if("China".equals(place)){
return new BenzCarInChina(carName, color);
}else{
System.out.println("暂无!");
return null;
}
}
}
public class FactoryPatterDemoSpace {
public static void main(String[] args) {
CarFactory carFactory = new BenzCarFactory();
Car car01 = carFactory.createCar("奔驰233", "黑色", "China");
car01.getInfo(); // 汽车名称:奔驰233 ,汽车颜色: 黑色 ,汽车配置来源:中国????-China
Car car02 = carFactory.createCar("奔驰666", "蓝色", "Germany");
car02.getInfo(); // 汽车名称:奔驰666 ,汽车颜色: 蓝色 ,汽车配置来源:德国????-Germany
}
}
原文:https://www.cnblogs.com/openmind-ink/p/13593705.html