工厂设计模式之:简单工厂、工厂方法、抽象工厂

简单工厂模式(Simple Factory):简单工厂模式又叫静态工厂模式,顾名思义,通过一个具体的工厂类,在该工厂类中定义返回值为不同实例对象的静态方法,来获得各种具体的实例对象。

工厂方法模式(Factory Method):建立一个抽象工厂,其不同的工厂实例用来创建不同的产品实例对象(单个产品),如果要增加新的产品,只需增加新的产品工厂即可。符合开闭原则。

抽象工厂模式(Abstract Factory):建立一个抽象工厂,用来实例化工厂子类,这些工厂子类用来生产对应的产品族(即一组对象实例)。

代码:

 1 package com.yan.factory;
 2
 3 /**
 4  * 接口Car的一个实现类CarA
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class CarA implements Car {
10
11     public CarA() {
12     }
13
14     public void run() {
15         System.out.println("CarA is running...");
16     }
17 }
 1 package com.yan.factory;
 2
 3 /**
 4  * 接口Car的一个实现类CarB
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class CarB implements Car {
10
11     public CarB() {
12     }
13
14     public void run() {
15         System.out.println("CarB is running...");
16     }
17 }
 1 package com.yan.factory;
 2
 3 /**
 4  * 接口Car的一个实现类CarC
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class CarC implements Car {
10
11     public CarC() {
12     }
13
14     public void run() {
15         System.out.println("CarC is running...");
16     }
17 }
 1 package com.yan.factory;
 2
 3 /**
 4  * 静态工厂类CarFactory,用来创建Car实例
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class CarFactory {
10
11     public CarFactory() {
12     }
13
14     public static Car getCar(String car) {
15         switch (car) {
16         case "CarA":
17             return new CarA();
18         case "CarB":
19             return new CarB();
20         case "CarC":
21             return new CarC();
22
23         default:
24             System.out.println("Illeagle input...");
25             return null;
26         }
27     }
28
29 }
 1 package com.yan.factory;
 2
 3 /**
 4  * 用于测试静态工厂的客户端Client
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class Client {
10
11     public Client() {
12     }
13
14     public static void main(String[] args) {
15         Car carA = CarFactory.getCar("CarA");
16         Car carB = CarFactory.getCar("CarC");
17         Car carC = CarFactory.getCar("CarB");
18         carA.run();
19         carB.run();
20         carC.run();
21     }
22 }

工厂方法模式:

创建工厂接口

1 package com.yan.factoryMethod;
2
3 public interface FactoryInterface {
4     Car createCar();
5 }

分别创建CarA、CarB、CarC的工厂类

 1 package com.yan.factoryMethod;
 2
 3 /**
 4  * 工厂接口FactoryInterface的实现工厂类CarAFactory,用来创建CarA实例
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class CarAFactory implements FactoryInterface {
10
11     public CarAFactory() {
12     }
13
14     @Override
15     public Car createCar() {
16         return new CarA();
17     }
18
19 }
 1 package com.yan.factoryMethod;
 2
 3 /**
 4  * 工厂接口FactoryInterface的实现工厂类CarBFactory,用来创建CarB实例
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class CarBFactory implements FactoryInterface {
10
11     public CarBFactory() {
12     }
13
14     @Override
15     public Car createCar() {
16         return new CarB();
17     }
18
19 }
 1 package com.yan.factoryMethod;
 2
 3 /**
 4  * 工厂接口FactoryInterface的实现工厂类CarBFactory,用来创建CarB实例
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class CarCFactory implements FactoryInterface {
10
11     public CarCFactory() {
12     }
13
14     @Override
15     public Car createCar() {
16         return new CarC();
17     }
18
19 }

测试客户端

 1 package com.yan.factoryMethod;
 2
 3 /**
 4  * 用于测试的客户端Client
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class Client {
10
11     public Client() {
12     }
13
14     public static void main(String[] args) {
15         Car carA = new CarAFactory().createCar();
16         Car carB = new CarBFactory().createCar();
17         Car carC = new CarCFactory().createCar();
18         carA.run();
19         carB.run();
20         carC.run();
21     }
22 }

抽象工厂模式:需要用到产品族的概念,实现工厂接口的各个工厂分别负责一个产品族的生产。

1.引擎(高端、低端)

2.座椅(高端、低端)

3.工厂(高端(高端引擎、高端座椅)、低端(低端引擎、低端座椅))

 1 package com.yan.abstractFactory;
 2
 3 /**
 4  * 引擎接口
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public interface Engine {
10
11     void engineMethod();
12 }
 1 package com.yan.abstractFactory;
 2
 3 /**
 4  * 座椅接口
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public interface Seat {
10     void seatmethod();
11
12 }
 1 package com.yan.abstractFactory;
 2
 3 /**
 4  * 定义工厂接口,用来定义生产产品要用到的方法
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public interface FactoryInterface {
10     Engine createEngine();
11
12     Seat createSeat();
13 }
 1 package com.yan.abstractFactory;
 2
 3 /**
 4  * 定义一个低端引擎类,实现引擎接口
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class LowEngine implements Engine {
10
11     public LowEngine() {
12     }
13
14     @Override
15     public void engineMethod() {
16         System.out.println("This is a low engine...");
17     }
18
19 }
 1 package com.yan.abstractFactory;
 2
 3 /**
 4  * 定义一个低端座椅类,实现座椅接口
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class LowSeat implements Seat {
10
11     public LowSeat() {
12     }
13
14     @Override
15     public void seatmethod() {
16         System.out.println("This is a low seat...");
17     }
18
19 }
 1 package com.yan.abstractFactory;
 2
 3 /**
 4  * 定义一个低端工厂类,实现工厂接口,用于生产低端产品族
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class LowFactory implements FactoryInterface {
10
11     public LowFactory() {
12     }
13
14     @Override
15     public Engine createEngine() {
16         return new LowEngine();
17     }
18
19     @Override
20     public Seat createSeat() {
21         return new LowSeat();
22     }
23
24 }
 1 package com.yan.abstractFactory;
 2
 3 /**
 4  * 定义高端引擎类,实现引擎接口
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class LuxuryEngine implements Engine {
10
11     public LuxuryEngine() {
12     }
13
14     @Override
15     public void engineMethod() {
16         System.out.println("This is a Luxury Engine...");
17     }
18
19 }
 1 package com.yan.abstractFactory;
 2
 3 /**
 4  * 定义一个高端座椅类,实现座椅接口
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class LuxurySeat implements Seat {
10
11     public LuxurySeat() {
12     }
13
14     @Override
15     public void seatmethod() {
16         System.out.println("This is a luxury seat...");
17     }
18
19 }
 1 package com.yan.abstractFactory;
 2
 3 /**
 4  * 定义一个高端工厂,实现工厂接口,用来生产高端的产品族
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class LuxuryFactory implements FactoryInterface {
10
11     public LuxuryFactory() {
12     }
13
14     @Override
15     public Engine createEngine() {
16         return new LuxuryEngine();
17     }
18
19     @Override
20     public Seat createSeat() {
21         return new LuxurySeat();
22     }
23
24 }
 1 package com.yan.abstractFactory;
 2
 3 /**
 4  * 用于测试抽象工厂模式的测试客户端
 5  *
 6  * @author Yan
 7  *
 8  */
 9 public class Client {
10
11     public Client() {
12     }
13
14     public static void main(String[] args) {
15         /* 生成高端工厂的实例,生产高端产品 */
16         FactoryInterface factory = new LuxuryFactory();
17         Engine engine = factory.createEngine();
18         Seat seat = factory.createSeat();
19         engine.engineMethod();
20         seat.seatmethod();
21         /* 成产低端工厂的实例,生产低端产品 */
22         FactoryInterface factory2 = new LowFactory();
23         Engine engine2 = factory2.createEngine();
24         Seat seat2 = factory2.createSeat();
25         engine2.engineMethod();
26         seat2.seatmethod();
27     }
28
29 }
时间: 2024-08-10 23:29:48

工厂设计模式之:简单工厂、工厂方法、抽象工厂的相关文章

详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博文,并不是像一些"非主流"的爱情观那样"宁缺毋滥". 只是其一呢,因为相当于给自己做一个总结,加深一下自己这方面的认识,因为掌握了和把它写出来我感觉后者还可以对技能有一个提升,其二呢是因为最近公司有一个内部的training需要讲设计模式. v写在前面 在这里呢,需要向

java/android 设计模式学习笔记(4)---抽象工厂模式

再来介绍一下抽象工厂模式(Abstact Factory Pattern),也是创建型模式之一,上篇博客主要介绍了工厂方法模式.抽象工厂模式和工厂方法模式稍有区别.工厂方法模式中工厂类生产出来的产品都是具体的,也就是说每个工厂都会生产某一种具体的产品,但是如果工厂类中所生产出来的产品是多种多样的,工厂方法模式也就不再适用了,就要使用抽象工厂模式了. 抽象工厂模式的起源或者最早的应用,是对不同操作系统的图形化解决方案,比如在不同操作系统中的按钮和文字框的不同处理,展示效果也不一样,对于每一个操作系

创建和使用解耦——工厂模式详解(工厂方法+抽象工厂)

1.前言 直接new一个对象是最简单的创建对象的方式,但大量出现在业务代码中会带来至少两个问题.1:创建对象的细节直接暴露在业务代码中,修改实现细节必须修改相关的大量客户端代码.2:直接面向具体类型编程,违反了面向接口编程的原则,系统进行扩展时也不得不进行大量修改.要使得系统具有的良好的可扩展性以及后期易于维护,必须实现对产品的获取和对产品的使用解耦.要做到这两点,首先要对客户端代码屏蔽掉创建产品的细节,其次,客户端必须面向产品的抽象编程,利用java的多态特性在运行时才确定具体的产品.而这,正

设计模式学习笔记(十一:抽象工厂模式)

1.1概述 提供一个创建一系列或相互依赖对象的接口,而无须指定他们具体的类.这就是抽象工厂模式的定义. 设计某些系统时可能需要为用户提供一系列相关的对象,但系统不希望用户直接使用new运算符实例化这些对象,而是应当由系统来控制这些对象的创建,否则用户不仅要清楚地知道使用哪些类来创建这些对象,而且还必须要清楚对象之间是如何关联的,使得用户的代码和这些类形成紧耦合.缺乏弹性.不利于维护. 例如,军队要为士兵(用户)提供机关枪.手枪以及相应的子弹,但军队系统不希望由士兵提供来生产机关枪.手枪以及子弹,

设计模式之简单工厂/工厂方法/抽象工厂

这三个设计模式都属于创建型模式,之间具有关联性,就放在一起讲解.其实简单工厂模式是工厂方法的一个特例,并不是23种设计模式的一种. 使用java来写的这几个设计模式.java文件目录树如下所示: [email protected]:~/code/designpattern/SimpleFactory/src$ tree . ├── Client.java └── zy ├── abstractfactory │   ├── AccerFactory.java │   ├── AppleFacto

设计模式之 简单工厂,工厂方法,抽象工厂

学习来源: C#设计模式,刘伟 创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展. 引言: 简单工厂(静态工厂) 1, 模式适用环境 工厂类负责创建的对象比较少,由于创建的对象较少 ,不会造成工厂方法中的业务逻辑太过复杂 客户端只知道传入工厂类的参数,对于如何创建对象 并不关心 2, 简单工厂(静态工厂)方法的缺点: 工厂类集中了所有产品的创建逻辑,职责过重,一旦 不能正常工作,整个系统都要受到影响 增加系统中类

设计模式 简单工厂+工厂方法+抽象工厂

简单工厂 简单工厂的优缺点: 缺点:①违反了OCP(开放-封闭原则).(当工厂内增加一个方法创建对象时候,需要在原来的工厂内,添加一个case语句).修改原来的类,是违反设计原则的. ②增加客户端和工厂类的耦合. 优点:①去除(非降低)客户端和具体产品的耦合.客户端和具体产品中间增加一个工厂类,增加客户端和工厂类的耦合. ②封装工厂类,实现代码多平台的复用性.创建对象的过程被封装成工厂类,可以多平台(控制台+WEB+Winform...手机端)调用这个工厂. ③封装工厂类,创建对象的过程(具体逻

大话设计模式C++实现-第15章-抽象工厂模式

一.UML图 二.概念 抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类. 三.包括的角色 (1)抽象工厂 (2)详细工厂:包含详细工厂1和详细工厂2.详细工厂1用于生产详细产品A1和详细产品B1,详细工厂2用于生产详细产品A2和详细产品B2: (3)抽象产品:包含抽象产品A和抽象产品B. (4)详细产品:包含抽象产品A所相应的详细产品A1和A2.以及抽象产品B所相应的详细产品B1和B2. 说明:在<大话设计模式>中,上述的1

《大话设计模式》学习笔记11:抽象工厂模式

切换数据库类型示例: 1.User类: public class User { public int Id { get; set; } public string Name { get; set; } } 2.AbstractProduct(以User为例): public interface IUser { void Insert(User user); User GetUser(int id); } 3.Product(以User.SQL Server为例): public class Sq

【设计模式】创建型模式之抽象工厂Abstract Factory

抽象工厂Abstract Factory是一种创建型设计模式,目的在于提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.抽象工厂的类图如下,客户仅与抽象类定义的定义的接口交互,而不使用特定的具体类的接口.一个系统包含多种产品时,AbstractFactory声明创建各种抽象产品对象的操作接口,这些接口是直接暴露给Client的,而具体产品对象的创建则延迟到子类ConcreteFactory,Client面对的产品类是AbstractProduct,无需关系具体产品类是什么.在运