创建型模式中

1、工厂方法模式
 
1.1、模式的定义与特点
 
       定义一个创建产品对象的工厂接口,将对象产品的实际创建工作延迟到具体的子类中,这满足创建型模式中所要求的的“创建与使用相分离”的特点。
 
       我们把创建的对象成为产品,把创建产品的对象成为工厂。如果创建的工厂不多,只需要一个工厂类就可以完成,这种模式叫做“简单工厂模式”,它不属于23中经典的设计模式之一。本文介绍的工厂方法模式是对简单工厂模式的进一步抽象,其好处是可以使得系统在不断修改原有代码的基础上引进新的产品,满足开闭原则。
 
    工厂方法模式的主要优点有:
 
    1、用户只需要知道具体工厂的名称就可得到所需的产品,无序知道产品的具体创建过程。
    2、在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改。
 
    缺点是每增加一个产品就要增加一个具体的产品类和一个对应的具体工厂类,这增加了系统的复杂度。
 
1.2、模式的结构与实现
 
    工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。
 
     抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法newProduct()来创建产品。
     具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建
     抽象产品: 定义了产品的规范,描述了产品的主要特性和功能
     具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
 
工厂方法模式的特点是当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有的工厂对象不需要进行任何修改,也不需要修改客户端,很好符合“开闭原则”。
 
     
实现代码如下:
public class AbstractFactoryTest
{
    public static void main(String[] args)
    {
            Product a = new ConcreteProduct1();
            AbstractFactory af = new ConcreteFactory1();
            a=af.newProduct();
            a.show();
    }
}
//抽象产品:提供了产品的接口
interface Product
{
    public void show();
}
//具体产品1:实现抽象产品中的抽象方法
class ConcreteProduct1 implements Product
{
    public void show()
    {
        System.out.println("具体产品1显示...");
    }
}
//具体产品2:实现抽象产品中的抽象方法
class ConcreteProduct2 implements Product
{
    public void show()
    {
        System.out.println("具体产品2显示...");
    }
}
//抽象工厂:提供了厂品的生成方法
interface AbstractFactory
{
    public Product newProduct();
}
//具体工厂1:实现了厂品的生成方法
class ConcreteFactory1 implements AbstractFactory
{
    public Product newProduct()
    {
        System.out.println("具体工厂1生成-->具体产品1...");
        return new ConcreteProduct1();
    }
}
//具体工厂2:实现了厂品的生成方法
class ConcreteFactory2 implements AbstractFactory
{
    public Product newProduct()
    {
        System.out.println("具体工厂2生成-->具体产品2...");
        return new ConcreteProduct2();
    }
}
1.3、模式的应用场景
 
抽象工厂模式通常适用以下场景:
1、当需要创建的对象是一系列相关关联或者相互依赖的产品族时,如电气工厂的电视,洗衣机或者空调等
2、系统中有多个产品族,但每次只是适用其中某一族产品。
3、系统中提供了产品的类库,且所有的产品的接口相同,客户端不依赖产品实例的创建细节和内部构造。
 
1.4模式的拓展
 
当增加一个新的产品族时候只需要增加一个具体的工厂,当产品族中需要增加一个新种类的产品时,则所有的工厂都需要进行修改。当系统中仅存在一个等级结构的产品时,抽象工厂模式将退化成工厂方法模式。其结构图如下:
 
2、抽象工厂方法模式
    
       前面介绍的工厂方法模式中考虑的是一类产品的生产,如电视机厂只生产电视机。同种类称为同等级,也就是说,工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如电器厂既生产电视机又生产洗衣机或空调。
 
1.1、模式的定义与特点
 
       是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品
 
   使用抽象工厂模式一般要满足:系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。系统一次只可能消费其中某一族产品,即同族的产品一起使用。
 
抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。
  • 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
  • 当增加一个新的产品族时不需要修改原代码,满足开闭原则。
 
其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
 
2.2、模式的结构与实现
 
   抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。现在我们来分析其基本结构和实现方法。
 
抽象工厂模式的主要角色如下。
  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系
从类结构图中可以看出抽象工厂模式的结构同工厂方法模式的结构相似,不同的是其产品的种类不止一个,所以创建产品的方法也不止一个。
 
实现代码如下:
interface AbstractFactory{
    public Product1 newProduct1();
    public Product2 newProduct2();
}
class ConcreteFactory1 implements AbstractFactory
{
    public Product1 newProduct1()
    {
        System.out.println("具体工厂 1 生成-->具体产品 11...");
        return new ConcreteProduct11();
    }
    public Product2 newProduct2()
    {
        System.out.println("具体工厂 1 生成-->具体产品 12...");
        return new ConcreteProduct21();
    }
}
class ConcreteFactory2 implements AbstractFactory
{
    public Product1 newProduct1()
    {
        System.out.println("具体工厂 2 生成-->具体产品 21...");
        return new ConcreteProduct11();
    }
    public Product2 newProduct2()
    {
        System.out.println("具体工厂 2 生成-->具体产品 22...");
        return new ConcreteProduct21();
    }
}
interface Product1 {
    public void show();
}
interface Product2 {
    public void show();
}
class ConcreteProduct11 implements  Product1 {
    @Override
    public void show() {
        System.out.println("具体方法1");
    }
}
class ConcreteProduct12 implements  Product1 {
    @Override
    public void show() {
        System.out.println("具体方法2");
    }
}
class ConcreteProduct21 implements  Product1 {
    @Override
    public void show() {
        System.out.println("具体方法3");
    }
}
class ConcreteProduct22 implements  Product1 {
    @Override
    public void show() {
        System.out.println("具体方法4");
    }
}
public class TestAbstractFactory {
    public static void main(String[] args) {
        
    }
}

2.3 模式的应用场景

抽象工厂模式通常适用于以下场景:
  1. 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如美的工厂会生产电视机、洗衣机、空调等。
  2. 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
  3. 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。

2.4 模式的扩展

抽象工厂模式的扩展有一定的“开闭原则”倾斜性:
  1. 当增加一个新的产品族时只需增加一个新的具体工厂,不需要修改原代码,满足开闭原则。
  2. 当产品族中需要增加一个新种类的产品时,则所有的工厂类都需要进行修改,不满足开闭原则。
 
另一方面,当系统中只存在一个等级结构的产品时,抽象工厂模式将退化到工厂方法模式。
 

猜你喜欢

转载自www.cnblogs.com/liujiarui/p/12309206.html