设计模式-工厂模式(详细)
工厂模式
- 1、什么是工厂模式
- 2、工厂模式有哪些,各自的特点是什么
- (1)简单工厂模式
- (2)工厂方法模式
- (3)抽象工厂模式
- 3、代码
- (1)简单工厂模式代码
- (2)工厂方法模式代码
- (3)抽象工厂模式代码
1、什么是工厂模式
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
2、工厂模式有哪些,各自的特点是什么
(1)简单工厂模式
- 概念:只需要一个工厂就可以创建产品的工厂模式
- 特点:
(1)创建实例的方法通常为静态方法
(2)简单工厂模式每增加一个产品,就需要增加一个产品类,增加了系统的复杂度,不符合开闭原则
- 结构:
(1)简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。
工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
(2)抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
(3)具体产品(ConcreteProduct):是简单工厂模式的创建目标。
(2)工厂方法模式
- 概念:是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
简单来说,就是增加了产品类型工厂,同一产品类型(例如永久牌自行车和凤凰牌自行车都是自行车)的产品在同一个工厂中生产。
- 特点:
(1)优点:- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
(2)缺点:- 类的个数容易过多,增加复杂度- 增加了系统的抽象性和理解难度- 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决
- 结构:
(1)抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
(2)具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
(3)抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
(4)具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
(3)抽象工厂模式
- 概念:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级
的产品的模式结构。
- 特点:工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
- 优点:
(1)可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
(2)当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
(3)抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。
- 缺点:
当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。
- 使用条件:
(1)系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
(2)系统一次只可能消费其中某一族产品,即同族的产品一起使用。
- 结构:
(1)抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
(2)具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
(3)抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
(4)具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系
- 个人理解:一个抽象工厂,多个产品牌子工厂,多个产品工厂
- 举例:品牌 产品
(1) 海尔 电视机、空调、洗衣机
(2) 格力 电视机、空调、洗衣机
我们可以创建3个产品工厂,两个品牌工厂,最终可以生产海尔牌的电视机、空调、洗衣机,格力牌的电视机、空调、洗衣机
3、代码
(1)简单工厂模式代码
产品接口
/*** 产品接口** @author lyq* @version 1.0* @date 2021/7/12 9:43*/
public interface Product {/*** 展示产品*/void show();
}
产品1
/*** 产品类1** @author lyq* @version 1.0* @date 2021/7/12 9:41*/
public class Product1 implements Product{@Overridepublic void show() {System.out.println("电视机");}
}
产品2
/*** 产品类2** @author lyq* @version 1.0* @date 2021/7/12 9:41*/
public class Product2 implements Product {@Overridepublic void show() {System.out.println("洗衣机");}
}
工厂
package factory.simple_factory;/*** 简单工厂模式** @author lyq* @version 1.0* @date 2021/7/12 9:33*/
public class SimpleFactory {public static Product makeProduct(int kind) {switch (kind) {case 0:return new Product1();case 1:return new Product2();default:break;}return null;}public static void main(String[] args) {Product product = SimpleFactory.makeProduct(1);product.show();}}
结果
洗衣机
个人理解
简单工厂模式:适合少量产品的生产。一个产品就需要一个具体的产品类和一个对应的工厂。比如上个例子中的
SimpleFactory.class
中的makeProduct()
方法,每增加一个产品,就需要在switch
中增加一个工厂和创建工厂所对应的产品类。
(2)工厂方法模式代码
抽象工厂
/*** 抽象工厂,用来生产产品工厂** @author lyq* @version 1.0* @date 2021/7/12 10:15*/
public interface AbustractFactory {/*** 创建产品* @return Product*/Product newProduct();
}
产品接口
/*** 产品接口,描述产品的特性** @author lyq* @version 1.0* @date 2021/7/12 10:15*/
public interface Product {void show();
}
具体产品工厂
package factory.factory_method;/*** 类型1产品工厂** @author lyq* @version 1.0* @date 2021/7/12 10:28*/
public class ConcreteFactory1 implements AbustractFactory {@Overridepublic Product newProduct() {System.out.print("凤凰牌:");return new ConcreteProduct1();}
}
package factory.factory_method;/*** 类型2产品工厂** @author lyq* @version 1.0* @date 2021/7/12 10:28*/
public class ConcreteFactory2 implements AbustractFactory {@Overridepublic Product newProduct() {System.out.print("永久牌:");return new ConcreteProduct2();}
}
产品
package factory.factory_method;/*** 产品1** @author lyq* @version 1.0* @date 2021/7/12 10:30*/
public class ConcreteProduct1 implements Product {@Overridepublic void show() {System.out.println("自行车");}
}
package factory.factory_method;/*** 产品2** @author lyq* @version 1.0* @date 2021/7/12 10:30*/
public class ConcreteProduct2 implements Product {@Overridepublic void show() {System.out.println("自行车");}
}
测试
package factory.factory_method;/*** TODO** @author lyq* @version 1.0* @date 2021/7/12 11:50*/
public class Test {public static void main(String[] args) {ConcreteFactory1 cf1 = new ConcreteFactory1();cf1.newProduct().show();ConcreteFactory2 cf2 = new ConcreteFactory2();cf2.newProduct().show();}
}
结果
凤凰牌:自行车
永久牌:自行车
个人理解
工厂方法模式,由于他们有一个共同的产品接口,该接口中说明了该类产品的一些特性,所以适合同一类型的产品生产。
(3)抽象工厂模式代码
抽象工厂:包含多个产品种类
package factory.abstract_factory;/*** 抽象工厂,用来生产产品工厂** @author lyq* @version 1.0* @date 2021/7/12 10:15*/
public interface AbustractFactory {/*** 创建产品种类1* @return Product*/Product1 newProduct1();/*** 创建产品种类2* @return Product*/Product2 newProduct2();
}
产品接口
package factory.abstract_factory;/*** 产品接口,描述产品的特性** @author lyq* @version 1.0* @date 2021/7/12 10:15*/
public interface Product1 {void show();
}
package factory.abstract_factory;/*** 产品接口,描述产品的特性** @author lyq* @version 1.0* @date 2021/7/12 10:15*/
public interface Product2 {void show();
}
产品工厂
package factory.abstract_factory;/*** 类型1产品工厂** @author lyq* @version 1.0* @date 2021/7/12 10:28*/
public class ConcreteFactory1 implements AbustractFactory {@Overridepublic Product1 newProduct1() {System.out.print("凤凰牌:");return new ConcreteProduct11();}@Overridepublic Product2 newProduct2() {System.out.print("凤凰牌:");return new ConcreteProduct21();}
}
package factory.abstract_factory;/*** 类型2产品工厂** @author lyq* @version 1.0* @date 2021/7/12 10:28*/
public class ConcreteFactory2 implements AbustractFactory {@Overridepublic Product1 newProduct1() {System.out.print("永久牌:");return new ConcreteProduct12();}@Overridepublic Product2 newProduct2() {System.out.print("永久牌:");return new ConcreteProduct22();}
}
具体产品
package factory.abstract_factory;/*** 产品1** @author lyq* @version 1.0* @date 2021/7/12 10:30*/
public class ConcreteProduct11 implements Product1 {@Overridepublic void show() {System.out.println("自行车");}
}
package factory.abstract_factory;/*** 产品1** @author lyq* @version 1.0* @date 2021/7/12 10:30*/
public class ConcreteProduct12 implements Product1 {@Overridepublic void show() {System.out.println("自行车");}
}
package factory.abstract_factory;/*** 产品2** @author lyq* @version 1.0* @date 2021/7/12 10:30*/
public class ConcreteProduct21 implements Product2 {@Overridepublic void show() {System.out.println("电视机");}
}
package factory.abstract_factory;/*** 产品2** @author lyq* @version 1.0* @date 2021/7/12 10:30*/
public class ConcreteProduct22 implements Product2 {@Overridepublic void show() {System.out.println("电视机");}
}
测试
package factory.abstract_factory;/*** TODO** @author lyq* @version 1.0* @date 2021/7/12 11:50*/
public class Test {public static void main(String[] args) {ConcreteFactory1 cf1 = new ConcreteFactory1();cf1.newProduct1().show();cf1.newProduct2().show();ConcreteFactory2 cf2 = new ConcreteFactory2();cf2.newProduct1().show();cf2.newProduct2().show();}
}
结果
凤凰牌:自行车
凤凰牌:电视机
永久牌:自行车
永久牌:电视机
个人理解
这里创建了:
两个品牌(产品工厂):凤凰牌、永久牌
两个产品种类(具体产品):电视机、自行车,由于要分别生产凤凰牌和永久牌的电视机和自行车,所以要创建四个产品类。
参考了:c语言中文网 http://c.biancheng.net/view/8385.html
设计模式-工厂模式(详细)相关推荐
- Java设计模式-工厂模式(3)抽象工厂模式
在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...
- Java设计模式-工厂模式(2)工厂方法模式
在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...
- Java设计模式-工厂模式(1)简单工厂模式
Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...
- 设计模式---工厂模式
设计模式---工厂模式 工厂方法模式 概述:工厂方法模式中抽象工厂负责定义创建对象的接口,具体创建工作由继承抽象工厂的具体类实现. 优点:客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新 ...
- java设计模式工厂模式_Java中的工厂设计模式
java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...
- java设计模式工厂模式_Java中的复合设计模式
java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...
- java设计模式工厂模式_Java中的桥梁设计模式
java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...
- java设计模式工厂模式_Java中的外观设计模式
java设计模式工厂模式 Facade Design Pattern is one of the Structural design patterns (such as Adapter pattern ...
- 设计模式-工厂模式(学习)
设计模式-工厂模式(学习) 在程序的世界里,就像射雕英雄传一样,我们的技能就像是武功一样,我们只有不断去学习练习才能有机会像郭靖一样成为"天下第一". 我认为技能和武功是很类似的, ...
最新文章
- RabbitMQ 入门系列(9)— Python 的 pika 库常用函数及参数说明
- 如何在R中正确使用列表?
- AngularJS快速上手
- Eclipse Java注释模板设置详解
- Java——List集合特有的功能
- 第5 章持久化类(Persistent Classes)
- A*算法(一)算法导言
- IE下angularJS页面跳转的bug
- 【MySQL】明明加了索引,为何不生效?
- C++基础知识(三)C++的输入和输出及操纵符
- JUCE框架教程(5)——Plugin项目构造基础
- (十九)论文阅读 | 目标检测之SNIP
- 数组合并对象里相同属性值
- 搞懂它,带你学会高效配置交换机!
- APIO2014 连珠线
- 蝴蝶影视服务器响应异常,elasticsearch的服务器响应异常及解决策略(转)
- python数据结构之单链表
- 基于HBuilder 开发 项目之微信支付
- HDUOJ 1114 Piggy-Bank
- c++ 用 eigen与opencv计算两个向量的夹角,两个向量之间的夹角,向量的朝向