设计模式-详解工厂模式

       工厂模式,是我们设计模式中比较简单的一种设计模式,但是其简单工厂-工厂方法-抽象工厂方法三则的区别与联系往往搞的程序员晕头转向;

       简单工厂-提供了一个抽象类下不同具体对象创建的封装;           

                     -----具体的披萨生产封装(榴莲味、芝士味、腊肠味)

       工厂方法-定义一个创建对象的抽象,将具体的对象创建交给子类;   

                      ----不同区域(芝加哥纽约)生产略显不同的各种口味披萨

       抽象工厂-通过抽象工厂接口,可以创建产品家族

                      ----不同地域(芝加哥,纽约)生产不同的披萨的原材料(原材料种类细微差别 冻榴莲、新鲜榴莲...)

 

简单工厂模式:一个披萨店提供不同口味的披萨饼,披萨生产过程:原料准备、烘焙、切片、包装

       1、将变化封装到工厂中,修改代码则修改工厂中的代码;

       2、工厂可以生产多种产品,不局限于一种类型

       3、给简单工厂提供静态方法,避免了实例化对象,也使得不能通过继承来改变创建方法的行为;

public class SimplePizzeFactory{

    public static Pizza createPizza(String type){
        Pizza pizza = null;
        if("cheese".equals(type)){     //奶酪披萨
            pizza = new CheesePizza();
        }else if("pepperoni".equals(type)){   //腊香肠披萨
            pizza = new CheesePizza();
        }else if("veggie".equals(type)){   //素食披萨
            pizza = new CheesePizza();
        }
    }

    //todo  创建快餐

}


//具体的披萨接口
public interface Pizze{
    public void prepare();
    public void bake();
    public void cut();
    public void box();
}

工厂方法模式:

前提: 随着业务发展,简单工厂支持的不同口味的披萨的准备、烘焙、切片、包装不能完全满足业务的扩张了;

        增加了很多的加盟店,需要提供下订单和配送服务,而所有的加盟店的下订单和配送服务是不变的,

        变化的是每个加盟店创建披萨的过程()

定义抽象类PizzaStore(披萨商店)将createPizza()  创建披萨的方法用户可继承、下订单和配货则进行统一的实现;

含义:定义一个创建对象的接口,但由子类决定要实例化类的哪一个,工厂方法让类把实例化推迟到子类;

与简单工厂方法的区别:

         ①简单工厂把全部事情都处理完了

         ②工厂方法,将具体实现交给子类;

//披萨商店
public abstract class PizzaStore{
    //创建披萨
    public void createPizza();

    //下单
    private void orderPizza();

    //配送
    private void distributionPizza();
}



//具体实现类
public class NYPizzaStore entends PizzaStore{
    //创建披萨
    public void createPizza();

}


//具体实现类
public class ChicagoPizzaStore entends PizzaStore{
    //创建披萨
    public void createPizza();

}


//PIZZA 实现更多纽约和芝加哥风味的不同种类披萨;

 

抽象工厂方法

前提:随着业务发展,披萨店,需要增加统一的原料生产与加工,以确保原料的质量;

        原料工厂在不同的区域实现相同稍带区别口味的披萨产品的原料生产;有面团、酱料、芝士等;

含义:通过抽象工厂所提供的接口,可以创建产品的家族(相关和依赖对象的家族);利用这些接口书写代码,我们将从实际工厂解耦,

       以便在不同的上下文中实现各式各样的工厂制造不同的产品

与工厂方法比较

       工厂方法:通过继承实现子类实现具体创建对象;    创建具体的产品;

       抽象工厂方法:通过对象的组合实现对象方法;      通过内部的工厂方法进行具体产品的创建;   

具体实现:改变原来的Pizza类的准备方法;

 


//第一步:定义接口:创建原料工厂(如果每个工厂实例都有通用的机制需要实现,可以变为抽象类)
public interface PizzaIngredientFactory{
    //面团
    public Dough createDough();
    //酱料
    public Sauce createSauce();
    //蛤蛎
    public Clam createClam();

}



/**
 *第二步: 
 *    1,为每一个区域创建一个工厂,的子类实现具体创建方法
 *    2,实现一组原料类供工厂使用 的原料家族
 *    3,将新的原料工厂整合进旧的PizzaStore代码中
 */
public class NYPizzaIngredientFactory entends PizzaIngredientFactory{
    //面团
    public Dough createDough(){
        return new CrustDough();
    
    }
    //酱料
    public Sauce createSauce(){
        
    }
    //芝士
    public Clam createClam(){
        //纽约靠海有新鲜的clam,  芝加哥就必须冷冻FrozenClams();
        return new FreshClam();
    }

}



/**
 *第三步:将新的原料工厂整合进旧的PizzaStore代码中
 *     1,修改pizza为抽象方法,其他方法不变, prepare变为抽象方法;
 */
public abstract class Pizze{
    public abstract void prepare();
    public void bake();
    public void cut();
    public void box();
}


public class CheesePizze extends Pizze{
    PizzaIngredientFactory ingredientFactory;
    void prepare(){
        //获取各种原材料
        Dough dough = ingredientFactory.createDough();
    }
}




 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
工厂模式是一种软件设计模式,用于创建对象。在Python中,可以使用工厂模式来封装对象的创建过程,并且可以在运行时动态地切换不同的对象实现。 工厂模式包括抽象工厂角色、具体工厂角色和产品角色三个主要组成部分。 抽象工厂角色是一个抽象的类或接口,定义了一个或多个创建产品的方法。在Python中,通常使用ABCMeta元类和abstractmethod装饰器来定义抽象基类和抽象方法。 具体工厂角色是抽象工厂角色的具体实现,实现了抽象工厂角色的创建产品的方法。 产品角色是具体工厂角色创建的对象,它们共同实现了同一个接口或继承了同一个父类。 在示例中,我们可以看到具体工厂角色的代码示例。其中,AliFactory、HuabeiFactory和WechatFactory分别实现了create_payment方法,并返回了对应的支付对象。这些具体工厂角色都继承自抽象工厂角色PaymentFactory,而PaymentFactory中定义了抽象方法create_payment。 通过使用工厂模式,我们可以封装对象的创建过程,提高代码的灵活性和可维护性。当需要创建不同的对象时,我们只需要调用对应的具体工厂角色来创建对象,而不需要直接实例化具体的产品角色。 综上所述,工厂模式是一种通过抽象工厂角色和具体工厂角色来封装对象创建过程的设计模式,可以实现对象的动态切换和解耦。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [23种Python设计模式之工厂方法模式详解](https://blog.csdn.net/weixin_51098806/article/details/123917610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值