设计模式3之工厂模式

A、介绍
在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何应对这种变化?提供一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变?这就是要说的Factory Method模式了。
顾名思义,建立一个接口(抽象工厂类),继承此接口的子类们(具体工厂类),可以各自相应生产出各种不同的产品类实例(具体产品),即接口不直接生产具体产品类,而是让继承它的子类去决定实例化哪一个类,使一个类的实例化延迟到其子类。

B、意义
定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
当新增加具体产品类时,不需要更改。
一句话:创建一组可以“生产产品类”的类。如:要创建“红色四轮”汽车类、“蓝色三轮”汽车类、“粉色二轮”汽车类,只需创建一个带“颜色、轮数”参数的工厂,分别new出三个汽车类,三个汽车类再分别new出三种汽车实例。
目的:用于生成“多种”不同类型的对象。
区别:
1.与建造者模式区别:建造者模式是将需要“一系列复杂”的多个类的构建过程,封装成一个“集成”类,即将一个复杂对象的构造与它的表示分离,侧重于“整合多个操作”。
2.与门面模式区别:门面模式是将多个接口整合成一个接口,侧重于“整合多个接口”。

C、结构
工厂模式主要是为创建对象提供了接口。工厂模式分为三类:
简单工厂:一个工厂生产多个产品
工厂方法:基工厂有多个子工厂,每个子工厂可以生产一个产品
抽象方法:基工厂有多个子工厂,每个子工厂可以生产多个产品

I.简单工厂模式(Simple Factory)
SimpleFactory
       |实
       |例
       |化
Production : ProductionA、ProductionB、...

Production productionA = SimpleFactory.GenerateProduction("ProductionA");
Production productionB = SimpleFactory.GenerateProduction("ProductionB");
1.工厂层:工厂类
2.产品层:
2.1 抽象产品层:抽象产品接口
2.2 具体产品层:具体产品类
3.调用层:产品A 我的产品 = 静态工厂类.GenerateProduction("产品A")

II. 工厂方法模式(Factory Method)
IFactory : FactoryA、FactoryB、...
    |实
    |例
    |化
Production : ProductionA、ProductionB、...

IFactory FactoryA = new FactoryA();
IFactory FactoryB = new FactoryB();
Production productionA = FactoryA.GenerateProduction();
Production productionB = FactoryB.GenerateProduction();

1.工厂层:
1.1 抽象工厂层:抽象工厂接口
1.2 具体工厂层:具体工厂类
2.产品层:
2.1 抽象产品层:抽象产品接口
2.2 具体产品层:具体产品类
3.调用层:工厂接口
工厂接口 工厂 = new 工厂子类(产品类);
产品类 产品 = 工厂.生产();

III. 抽象工厂模式(Abstract Factory)
IFactory : FactoryA、FactoryB、...
    |实
    |例
    |化
Production : ProdA1、ProdA2、ProdA3、ProdB1、ProdB2、...
同“工厂方法”模式,只不过工厂层中的每个工厂是包含多个产品生产方法。

D、实例
本例的主线:Driver(工厂)->Car(产品)
I、简单工厂(Simple Factory)
如需增加产品需要更改产品类
             --产品A
产品类--|
             --产品B
例:

//产品层
//抽象产品接口
public interface ICar{
    void launch();
}
//具体产品类
public Benz implements ICar{
    public void launch()
    {
        System.out.println("Driving Benz");
    }
}
public Bmw implements ICar{
    public void launch()
    {
        System.out.println("Driving Bmw");
    }
}

//工厂层
//工厂类(核心部分)
public class Driver{
    public static ICar DistributeCar(String s) throws Exception{
        if(s.equalsIgnoreCase("Benz"))
            return new Benz();
        else if(s.equalsIgnoreCase("Bmw"))
            return new Bmw();
        ...
        else throw new Exception();
    }
}
//调用层
//调用类
public class Program{
    public static void main(String[] args)
    {
        ICar car = Driver.DistributeCar("Benz");
        car.launch();
    }
}

弊端:需要一个全能类(或者叫上帝类),本例中是Driver。

II、工厂方法(Factory Method)
增加产品不需要更改工厂类,只需要在定义新工厂类时添加一个实现
一个工厂基类被多个工厂类实现,一个工厂类只可以生产一个产品
               --工厂A--产品A
工厂基类--|
               --工厂B--产品B
例:

//产品层
//抽象产品接口
同上
//具体产品类
同上

//工厂层
//抽象工厂接口(核心部分)
public interface Driver{
    ICar DistributeCar();
}
//具体工厂类
public class BenzDriver implements Driver{
    public ICar DistributeCar(){
        return new Benz();
    }
}
public class BmwDriver implements Driver{
    public ICar DistributeCar(){
        return new Bmw();
    }
}

//调用层
//调用类
public class Program{
    public static void main(String[] args){
        Driver _benzDriver = new BenzDriver();                  //工厂类
        ICar car = _benzDriver.DistributeCar();                 //(通过工厂类)得到产品类
        car.launch();
    }
}

III、抽象工厂(Abstract Factory)
同样是一个工厂基类被多个工厂类实现,但一个工厂类可以生产“一个系列的多个产品”,如手机工厂可以生产屏幕、电池、摄像头、内存等。
                                --产品A1
                  --工厂A--|
                |               --产品A2
  工厂基类--|
                |               --产品B1
                  --工厂B--|
                                --产品B2

例:

//产品层
//定义产品1抽象接口
interface ICar {...}
//定义产品1具体类
class Benz : ICar {...}
class Bmw : ICar {...}
//定义产品2抽象接口
interface IWheel {...}
//定义产品具体2类
class BenzWheel : IWheel {...}
class BmwWheel : IWheel {...}

//工厂层
//抽象工厂接口(核心部分)
public interface Driver{
    ICar DistributeCar();
    IWheel DistributeWheel();
}
//具体工厂类
public class BenzDriver implements Driver{
    public ICar DistributeCar(){
        return new Benz();
    }
    public IWheel DistributeWheel(){
        return new BenzWheel();
    }
}
public class BmwDriver implements Driver{
    public ICar DistributeCar(){
        return new Bmw();
    }
    public IWheel DistributeWheel(){
        return new BmwWheel();
    }
}

//调用层
//调用类
public class Program{
    public static Main(String[] args){
        //生产BenzWheel
        Driver benzDriver = new BenzDriver();
        ICar BenzCar = benzDriver.DistributeCar();
        IWheel BenzWheel = benzDriver.DistributeWheel();
    }
}
时间: 2024-08-06 11:39:25

设计模式3之工厂模式的相关文章

【设计模式】简单工厂模式

以面向对象的思想和简单工厂模式,写一个C++计算器程序,代码如下: #include <iostream> using namespace std; class Operation { public: Operation(double left, double right) { lhs = left; rhs = right; } const double GetLeft() const { return lhs; } const double GetRight() const { retur

设计模式之简单工厂模式

设计模式之简单工厂模式 动机:         不暴露实例化逻辑来创建对象.通过公共的接口创建新的对象.         这是一个简单的实现,客户端需要一个product,但是client不直接使用new对象,而是通过提供需要的对象信息来找factory得到新的product.         这个factory实例化一个具体的product并返回(转化成抽象的类),client段使用这个抽象的类而不用考虑它具体的实现. 应用举例:        也许工厂模式是使用最多的模式之一.举个例子,一个

设计模式之抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置. 他使具体创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离. 下面的代码还使用了反射与XML. 代码如下: using System; using System.Collections.Ge

设计模式之抽象工厂模式20170803

创建型设计模式之抽象工厂模式: 一.含义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 具体来说, 为一组具有相同约束(属性)的对象,提供一个接口,这个接口下有不同的实现,每个实现类对应一种类型的约束(一种具体的属性),同时提供该类型的约束(属性)下所有对象的创建方法 二.代码说明 1.主要有两个角色 1)一组互相影响的产品线(对象),也叫做产品族 2)抽象工厂类及其实现类 抽象工厂类:在N个产品族中,在抽象工厂类中就应该有N个创建方法 实现类:具体实现类是产品族的具体

设计模式初探—简单工厂模式

为什么要学习设计模式? 可重用.可维护.可扩展.灵活性好 什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 简单工厂模式的好处? (1)将具体业务和实现进行分离 (2)将多个具体业务之间进行解耦 解决的问题? 单独的类来创造

设计模式 2/23 工厂模式(二)

先要给各位同学灌输一个思想,世间本无设计模式,用的人多了,自然就有了 没有太明显的优劣之分,只道是谁更适合 如果没法理解<<工厂>>,建议阅读上一篇 设计模式 2/23 工厂模式(一) ,毕竟是一个渐进明细的过程,急不来的 这一篇分享 工厂模式 回想一下简单工厂,我们把具体类的实例化工作放在一个工厂方法里面来执行. 同时故意在上一篇提到了开放-封闭原则. 仔细想象看看上一篇的代码,到底有没有遵守这个原则,或者说这个原则有没有被严格意义的遵守,或者说遵守的程度是多少. 如果我们要新增

【幻化万千戏红尘】qianfengDay10-java基础学习:成员内部类、静态内部类、局部和匿名内部类,设计模式之简单工厂模式

课程回顾: 接口:1.属性:public\static\final2.方法:public\abstract 多态:1.静态化(编译时)多态重载2.动态化(运行时)多态重写对象转型 1.向上转型 2.向下转型 今日内容:内部类:定义在类的内部的类1.成员内部类格式:[修饰符] class 类名 { }内部不能有静态的属性和方法,可以访问外部类的属性,也可以调用外部类的方法 在静态方法中的使用格式:外部类 外对象=new 外部类();成员内部类 对象名=外对象.new 成员内部类(); 2.静态内部

JS设计模式(动态工厂模式)

<!--引入的核心JS文件--> <script type="text/javascript" src="CommonUtil.js"></script> <script type=text/javascript charset=utf-8> <!--JS设计模式(细粒度工厂模式)--> //搭建一个工厂环境 买什么车——(去什么店)卖车的店——卖车——生产车 //卖车店 super Shop 只有卖车的方

iOS设计模式 - (3)简单工厂模式

iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/details/40381721 一.简述 简单工厂模式(FACTORY),通过面向对象的封装,继承和多态来降低程序的耦合度.将一个具体类的实例化交给一个静态工厂方法来执行. 该模式中的角色包括: 工厂类(Simple Factory): 只包含了创建具体类的静态方法. 抽象产品(Product):

大话设计模式_简单工厂模式(Java代码)

简单的描述:一个父类.多个子类,实例化那个子类由一个单独的工厂类来进行 图片摘自大话设计模式: 运算类: 1 package com.longsheng.simpleFactory; 2 3 public class Calculate { 4 5 private double firstNum; 6 private double secondNum; 7 8 public double getFirstNum() { 9 return firstNum; 10 } 11 12 public v