设计模式——工厂模式

Posted 爱学习的大鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——工厂模式相关的知识,希望对你有一定的参考价值。

设计模式--工厂模式

简单工厂模式

模式介绍:

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

该模式中包含的角色及其职责

  • 工厂(Creator)角色

​ 工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

  • 抽象产品(Product)角色

​ 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

  • 具体产品(Concrete Product)角色

​ 简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

案例:

背景解析:有一家披萨店(PizzaStore),通过不同的平台(OrderPizza)点餐,用户可以选择喜欢的口味,通过简单工厂模式(SimpleFactory)将顾客的披萨进行生产,而披萨具有相同的特征(烘培、切割、装盒),可以抽象成相同的Pizza抽象类,使用简单工厂模式可以实现添加披萨类型时,披萨只需要继承基类,修改工厂类即可,无需其他代码的修改

结构:


披萨抽象类

public abstract class Pizza 

    protected String name;

    public abstract void prepare();

    public void cut() 
        System.out.println(name + ", 开始切割");
    

    public void box() 
        System.out.println(name + ", 开始装盒");
    

    public void bake() 
        System.out.println(name + ", 开始烘培");
    

    public void setName(String name) 
        this.name = name;
    

各种披萨子类

public class CheesePizza extends Pizza 
    @Override
    public void prepare() 
        System.out.println("制作奶酪披萨,准备原材料 ");
        setName("奶酪披萨");
    

public class GreekPizza extends Pizza 
    @Override
    public void prepare() 
        System.out.println("制作希腊披萨,准备原材料");
        setName("希腊披萨");
    

点餐系统

public class OrderPizza 

    private Pizza pizza = null;

    /**
     * 点餐
     */
    public OrderPizza() 
        String orderType = "";
        do 
            orderType = getType();
            pizza = PizzaSimpleFactory.createPizza(orderType);
            if (this.pizza != null) 
                // 输出制作
                this.pizza.prepare();
                this.pizza.bake();
                this.pizza.cut();
                this.pizza.box();
             else 
                System.out.println("取消订购");
                break;
            
         while (true);
    

    /**
     * 工具类选择披萨类型
     *
     * @return
     */
    private String getType() 
        try 
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("========披萨订购系统=========");
            System.out.println("1:希腊披萨 2:奶酪披萨 其他:退出");
            System.out.print("请选择:");
            String str = strin.readLine();
            return str;
         catch (IOException e) 
            e.printStackTrace();
            return "";
        
    

简单工厂类

public class PizzaSimpleFactory 

    /**
     * 通过用户选择返回不同类型的披萨
     * @param orderType 1:希腊披萨 2:奶酪披萨 其他:null
     * @return
     */
    public static Pizza createPizza(String orderType) 
        Pizza pizza = null;
        switch (orderType) 
            case "1" : 
                pizza = new GreekPizza();
                break;
            
            case "2" : 
                pizza = new CheesePizza();
                break;
            
        
        return pizza;
    

披萨店

public class PizzaStore 

    public static void main(String[] args) 
        new OrderPizza();
    

实现效果:

工厂方法模式

模式介绍:

工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。 [2]

工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

工厂方法模式(Factory Method pattern)是最典型的模板方法模式(Template Method pattern)应用。

案例:

在上述基础上,披萨店面扩大,现有有伦敦披萨店和北京披萨店,每个店有各自的具有当地特色的披萨产品(不一定名称相同),

结构:

披萨抽象类:

public abstract class Pizza 

    protected String name;

    public abstract void prepare();

    public void cut() 
        System.out.println(name + ", 开始切割");
    

    public void box() 
        System.out.println(name + ", 开始装盒");
    

    public void bake() 
        System.out.println(name + ", 开始烘培");
    

    public void setName(String name) 
        this.name = name;
    

披萨子类:

public class BJCheesePizza extends Pizza 
    @Override
    public void prepare() 
        System.out.println("制作北京奶酪披萨,准备原材料 ");
        setName("北京奶酪披萨");
    
public class BJGreekPizza extends Pizza
    @Override
    public void prepare() 
        System.out.println("制作北京的希腊披萨,准备原材料");
        setName("北京的希腊披萨");
    
public class LDCheesePizza extends Pizza 
    @Override
    public void prepare() 
        System.out.println("制作伦敦奶酪披萨,准备原材料 ");
        setName("伦敦奶酪披萨");
    
public class LDGreekPizza extends Pizza
    @Override
    public void prepare() 
        System.out.println("制作伦敦的希腊披萨,准备原材料");
        setName("伦敦的希腊披萨");
    

工厂抽象类:

public abstract class OrderPizzaFactoryMethod 

    private Pizza pizza = null;

    // 定义一个抽象方法
    abstract Pizza createPizza(String orderType);

    public OrderPizzaFactoryMethod() 
        String orderType = "";
        do 
            orderType = getType();
            pizza = createPizza(orderType);
            if (this.pizza != null) 
                // 输出制作
                this.pizza.prepare();
                this.pizza.bake();
                this.pizza.cut();
                this.pizza.box();
             else 
                System.out.println("取消订购");
                break;
            
        while (true);
    

    /**
     * 工具类选择披萨类型
     *
     * @return
     */
    private String getType() 
        try 
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("========披萨订购系统=========");
            System.out.println("1:希腊披萨 2:奶酪披萨 其他:退出");
            System.out.print("请选择:");
            String str = strin.readLine();
            return str;
         catch (IOException e) 
            e.printStackTrace();
            return "";
        
    

工厂子类:

public class BJOrderPizzaFactory extends OrderPizzaFactoryMethod 
    @Override
    Pizza createPizza(String orderType) 
        Pizza pizza = null;
        switch (orderType) 
            case "1" : 
                pizza = new BJGreekPizza();
                break;
            
            case "2" : 
                pizza = new BJCheesePizza();
                break;
            
        
        return pizza;
    
public class LDOrderPizzaFactory extends OrderPizzaFactoryMethod 
    @Override
    Pizza createPizza(String orderType) 
        Pizza pizza = null;
        switch (orderType) 
            case "1" : 
                pizza = new LDGreekPizza();
                break;
            
            case "2" : 
                pizza = new LDCheesePizza();
                break;
            
        
        return pizza;
    

点餐系统

public class PizzaStore 
    public static void main(String[] args) throws IOException 
        order();
    

    private static void order()  throws IOException
        BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("=========请选择地区=========");
        System.out.println("1:北京 2:伦敦 其他:退出");
        System.out.print("请选择:");
        String city = strin.readLine();
        switch (city) 
            case "1" : 
                new BJOrderPizzaFactory();
                break;
            
            case "2" : 
                new LDOrderPizzaFactory();
                break;
            
        
    

实现效果:


抽象工厂模式

模式介绍:

抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。在抽象工厂模式中,客户端不再负责对象的创建,而是把这个责任丢给了具体的工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。并且当一系列相互关联的产品被设计到一个工厂类里后,客户端的调用将会变得非常简单,而且,如果要更换这一系列的产品,则只需要更换一个工厂类即可。

详情 --> 五分钟学设计模式.04.抽象工厂模式

以上是关于设计模式——工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

创造型设计模式-----工厂方法模式

简单工厂模式

设计模式--简单工厂模式

简单工厂模式

设计模式工厂模式(创建型)

23种设计模式——简单工厂设计模式