headfirst设计模式读书笔记第四章--工厂模式

思想

工厂方法模式(factory method pattern)定义了一个创建对象的接口,由子类决定要实例化的类是哪一个,让类的实例化推迟到子类。

headfirst设计模式读书笔记第四章--工厂模式_第1张图片

 

 

 

从类图可以看出,工厂方法模式封装了具体类型的实例化,抽象的Creator类提供了一个抽象方法用来创建产品,同时也实现了一些操作产品的方法(如anOperation),这些方法不需要涉及ConcreteProduct,而是通过Product接口。所以,工厂方法模式帮助我们把产品的创建(子类实现的factoryMethod方法)与使用(Creator中anOperation等方法)解耦。

抽象工厂模式(abstract factory pattern)提供了一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。

从类图可以看出,抽象工厂模式允许客户(Client)使用抽象的接口(AbstractFactory)来创建一组相关的产品,而不需要关心实际产出的创建细节。这样一来,客户就从具体的产品创建中被解耦。

 

代码

headfirst设计模式读书笔记第四章--工厂模式_第2张图片

 

 

Pizza.Java

package pizza;

import java.util.ArrayList;

public abstract class Pizza {    //创建pizza类
    String name;
    String dough;
    String sauce;
    ArrayList toppings = new ArrayList();
    
     public void prepare(){
        System.out.println("Preparing " + name );
        for(int i = 0;ii){
            System.out.println("  "+toppings.get(i));
        }
    }
    
    public String getName() {
        return name;
    }
}

 

NYStyleCheesePizza.Java

package pizza;

import java.util.jar.Attributes.Name;

public class NYStyleCheesePizza extends Pizza{        //pizza具体子类
     public NYStyleCheesePizza() {
        // TODO Auto-generated constructor stub
         name = "Ny style";
         toppings.add("Cheese lalalal");
    }
}

 

PizzaStore.Java

package pizzastoree;

import pizza.Pizza;

public abstract class PizzaStore {
    public Pizza orderPizza(String type){
        Pizza pizza;
        
        pizza = createPizza(type);   //创建对象,对象的创建步奏延迟到主类中
        
        pizza.prepare();
        
        return pizza;
    }
    
    abstract Pizza createPizza(String type);
}

 

NYPizzaStore.Java

package pizzastoree;

import pizza.NYStyleCheesePizza;
import pizza.Pizza;

public class NYpizzaStore extends PizzaStore{
     @Override
    Pizza createPizza(String item) {
        // TODO Auto-generated method stub
        if(item.equals("cheese")){
            return new NYStyleCheesePizza();
        }else return null;
    }
}

 

Test.Java

package test;

import pizza.Pizza;
import pizzastoree.NYpizzaStore;
import pizzastoree.PizzaStore;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
         PizzaStore nyStore = new NYpizzaStore();
         Pizza pizza = nyStore.orderPizza("cheese");
         System.out.println(pizza.getName());

    }

}

 

结果

 

 

总结

1.所有的工厂都是用来封装对象创建的

2.简单工厂虽然不是真正的设计模式,但是是一个简单而且常用的方法,可以将客户程序从具体类解耦

3.工厂方法使用继承,把对象的创建延时到子类

4.抽象工厂使用对象组合,对象的创建被实现在工厂接口的方法中

工厂模式有什么用

系统可以在不修改具体工厂角色的情况下引进新的产品
客户端不必关心对象如何创建,明确了职责
更好的理解面向对象的原则:面向接口编程,而不要面向实现编程
工厂模式适用场景:

一个系统应当不依赖于产品类实例被创建,组成和表示的细节。这对于所有形态的工厂模式都是重要的
该系统的产品要有至少一个的产品族
工厂模式的约束:同属于同一个产品族的产品是设计成在一起使用的
不同的产品以一系列的接口的面貌出现,从而使得系统不依赖于接口实现的细节

 

你可能感兴趣的:(headfirst设计模式读书笔记第四章--工厂模式)