工厂模式

工厂模式

简单工厂模式

  • 简单工厂模式属于创建型模式,是工厂模式的一种,==建安工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.==简单工厂模式是工厂模式家族中最简单实用的模式

  • 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码).

  • 易于理解,简单易操作.

  • 违反了设计模式的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接口
  • 不要覆盖基类中俄以及实现的方法.
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容