工厂模式
简单工厂模式
简单工厂模式属于创建型模式,是工厂模式的一种,==建安工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.==简单工厂模式是工厂模式家族中最简单实用的模式
简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码).
易于理解,简单易操作.
违反了设计模式的ocp原则,即对==扩展开放,对修改关闭==,当我们给类增加新功能时,尽量不要修改代码,或者尽可能少修改代码
//旧的工厂模式
class Order{
//------
pizza=null;
if(orderType.equals("A"))
pizza=new APizza;
else if(orderType.equals("B"))
pizza=new BPizza;
//弊端:当需要添加新pizza时,需要修改代码
else if(orderType.equals("C"))
pizza=new CPizza;
else
return pizza;
}
改进思路:
- 把创建pizza对象封装到一个类中,这样我们有新的pizza种类时,只需要修改该类就行,其他有创建到pizza对象的代码旧不需要修改了
//简单工厂模式
class Order{
SimpleFactory factory;
Pizza pizza=null;
public Order(SimpleFactory factory){
this.factory=factory
}
public void setFactory(SimpleFactory factory){
this.factory=factory;
do{
ordderType=getType();
pizza=this.factory.createPizza(orderType);
}while(true)
}
}
class SimpleFactory{
public Pizza createPizza(String orderType){
Pizza pizza=null;
if(orderType.equals("A"))
pizza=new APizza;
else if(orderType.equals("B"))
pizza=new BPizza;
else if(orderType.equals("C"))
pizza=new CPizza;
else
return pizza;
}
}
工厂方法模式
- 工厂方法模设计方案:将pizza项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现.
- 工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类,工厂方法模式将==对象的实例化推迟到了子类==.
//允许客户点不同地点的不同pizza
class Pizza{}
class BjAPizza extends Pizza{}
class BjBPizza extends Pizza{}
class GzAPizza extends Pizza{}
class GzBPizza extends Pizza{}
abstract class Order{
SimpleFactory factory;
Pizza pizza=null;
//抽象方法,由子类实现
abstract public Pizza createPizza(String orderType);
public OrderPizza(){
do{
ordderType=getType();
//调用自己的抽象方法,由工厂子类实现
pizza=createPizza(orderType);
}while(true)
}
}
class BjOrder extends Order{
@Override
Pizza create Pizza(String orderType){
Pizza pizza=null;
if(orderType.equals("A"))
pizza=new APizza;
else if(orderType.equals("B"))
pizza=new BPizza;
else if(orderType.equals("C"))
pizza=new CPizza;
}
}
class GzOrder extends Order{}
抽象工厂模式
- 定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的实现类
- 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合.
- 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或称为进一步的抽象).
- 将工厂模式抽象成两层,AbstractFactory(抽象工厂)和具体实现的工厂子类.程序员可以根据创建对象类型是哟个对应的工厂子类.这样将单个简单工厂类变成了工厂簇,利用代码的维护和扩展.
interface AbsFactory{
createPizza(arg arg);
}
class BjFactory implements AbsFactory{
@Ovrride
createPizza(arg arg){}
}
class GzFactory implements AbsFactory{}
class Order{
AbsFactory factory;
public setfaftory(arg arg){
ordeType= getorderType();
pizza=factory.create(args);
return pizza;
}
}
class store{
order(){
new Ordder(new BjFactory);
}
}
JDK中的工厂应用
Calendar类
- getinstance()
小结
- 工厂模式的意义;将实例化对象的带啊抽象出来,放到一个类中同一管理和维护,达到和主项目怒的依赖关系达到解耦.从而提高项目的扩展和维护性.
- 创建对象实例时,不要直接new,而是把这个new动作交给一个放在工厂中的方法执行并返回.(变量不要直接持有具体类的引用.)
- 不要让类继承具体类,而是继承抽象类或者实现interface接口
- 不要覆盖基类中俄以及实现的方法.