设计模式--创建模式--抽象工厂模式

一、基本概念。

    1、 说明:抽象工厂模式是对工厂方法模式的改进,用于处理产品不只有一类的情况(多产品类型或者产品族概念)。抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。

    2、角色:

       A:AbstractFactory:声明一个创建抽象产品对象的操作接口。
       B:ConcreteFactory:实现创建具体产品对象的操作。
       C:AbstractProduct:为一类产品对象声明一个接口。
       D:ConcreteProduct:定义一个将被相应具体工厂创建的产品对象,以实现AbstractProduct接口。
       E:Client:测试方法

二、简单例子

       A:AbstractFactory:抽象工厂,制造瓶子和瓶酒。

 1 package comm.pattern.create.abstractFactory;
 2 
 3 /**
 4  * 
 5  * @Title: AbstractFactory.java
 6  * @Package: comm.pattern.create.abstractFactory
 7  * @Description: 描述该文件做什么
 8  * @author yangzhancheng
 9  * @2020年3月26日:下午10:39:18
10  *
11  */
12 public abstract class AbstractFactory {
13     
14     abstract public IBottle createBottle();
15     abstract public IBeer createBeer();
16 }

       B:ConcreteFactory:

       B-1:青岛啤酒场

 1 package comm.pattern.create.abstractFactory;
 2 
 3 /**
 4  * 
 5  * @Title: TsingtaoFactory.java
 6  * @Package: comm.pattern.create.abstractFactory
 7  * @Description: 青岛工厂
 8  * @author yangzhancheng
 9  * @2020年3月26日:下午10:41:18
10  *
11  */
12 public class TsingtaoFactory extends AbstractFactory {
13 
14     //玻璃瓶
15     @Override
16     public IBottle createBottle() {
17         return new GlassBottle();
18     }
19 
20     //青岛啤酒
21     @Override
22     public IBeer createBeer() {
23         return new TsingtaoBeer();
24     }
25 
26 }

       B-2:百威啤酒厂

 1 package comm.pattern.create.abstractFactory;
 2 
 3 /**
 4  * 
 5  * @Title: BudweiserFactory.java
 6  * @Package: comm.pattern.create.abstractFactory
 7  * @Description: 百威工厂
 8  * @author yangzhancheng
 9  * @2020年3月26日:下午10:46:32
10  *
11  */
12 public class BudweiserFactory  extends AbstractFactory {
13 
14     //易拉罐
15     @Override
16     public IBottle createBottle() {
17         return new CansBottle();
18     }
19 
20     //百威啤酒
21     @Override
22     public IBeer createBeer() {
23         return new BudweiserBeer();
24     }
25     
26 }

       C:AbstractProduct:

       C-1:啤酒

 1 package comm.pattern.create.abstractFactory;
 2 
 3 /**
 4  * 
 5  * @Title: Beer.java
 6  * @Package: comm.pattern.create.abstractFactory
 7  * @Description: 描述该文件做什么
 8  * @author yangzhancheng
 9  * @2020年3月26日:下午9:09:48
10  *
11  */
12 
13 public interface IBeer {
14     void name();
15 }

       C-2:啤酒瓶

 1 package comm.pattern.create.abstractFactory;
 2 
 3 /**
 4  * 
 5  * @Title: IBottle.java
 6  * @Package: comm.pattern.create.abstractFactory
 7  * @Description: 描述该文件做什么
 8  * @author yangzhancheng
 9  * @2020年3月26日:下午10:00:42
10  *
11  */
12 
13 public interface IBottle {
14     void name();
15 }

       D:ConcreteProduct:

       D-1:百威啤酒

 1 package comm.pattern.create.abstractFactory;
 2 
 3 /**
 4  * 
 5  * @Title: BudweiserBeer.java
 6  * @Package: comm.pattern.create.abstractFactory
 7  * @Description: 描述该文件做什么
 8  * @author yangzhancheng
 9  * @2020年3月26日:下午10:20:50
10  *
11  */
12 public class BudweiserBeer implements IBeer{
13     
14     public void name(){
15         System.out.println("百威啤酒...");
16     }
17 }

       D-2:青岛啤酒

 1 package comm.pattern.create.abstractFactory;
 2 
 3 /**
 4  * 
 5  * @Title: TsingtaoBeer.java
 6  * @Package: comm.pattern.create.abstractFactory
 7  * @Description: 描述该文件做什么
 8  * @author yangzhancheng
 9  * @2020年3月26日:下午10:21:34
10  *
11  */
12 public class TsingtaoBeer implements IBeer{
13     
14     public void name(){
15         System.out.println("青岛啤酒...");
16     }
17 }

     D-3:易拉罐

 1 package comm.pattern.create.abstractFactory;
 2 
 3 /**
 4  * 
 5  * @Title: CansBottle.java
 6  * @Package: comm.pattern.create.abstractFactory
 7  * @Description: 易拉罐
 8  * @author yangzhancheng
 9  * @2020年3月26日:下午10:32:45
10  *
11  */
12 public class CansBottle implements IBottle {
13 
14     @Override
15     public void name() {
16         System.out.println("易拉罐->");
17     }
18 
19 }

      D-4:玻璃瓶

 1 package comm.pattern.create.abstractFactory;
 2 
 3 /**
 4  * 
 5  * @Title: GlassBottle.java
 6  * @Package: comm.pattern.create.abstractFactory
 7  * @Description: 玻璃瓶操作
 8  * @author yangzhancheng
 9  * @2020年3月26日:下午10:36:00
10  *
11  */
12 public class GlassBottle implements IBottle {
13 
14     @Override
15     public void name() {
16         System.out.println("玻璃瓶->");
17     }
18 
19 }

       E:Client:测试方法

 1 package comm.pattern.create.abstractFactory;
 2 
 3 /**
 4  * 
 5  * @Title: Client.java
 6  * @Package: comm.pattern.create.abstractFactory
 7  * @Description: 客户端测试文件
 8  * @author yangzhancheng
 9  * @2020年3月26日:下午10:47:38
10  *
11  */
12 public class Client {
13 
14     public static void main(String[] args) {
15         System.out.println("------百威的工厂模拟-----------");
16         AbstractFactory bwFactory = new BudweiserFactory();
17         IBottle cansBottle        = bwFactory.createBottle();
18         IBeer   budweiserBeer     = bwFactory.createBeer();
19         cansBottle.name();
20         budweiserBeer.name();
21 
22         System.out.println("------青岛的工厂模拟-----------");
23         AbstractFactory tsFactory = new TsingtaoFactory();
24         IBottle glassBottle       = tsFactory.createBottle();
25         IBeer   tsingtaoBeer      = tsFactory.createBeer();
26         glassBottle.name();
27         tsingtaoBeer.name();
28     }
29 
30 }

允许结果:

------百威的工厂模拟-----------
易拉罐->
百威啤酒...
------青岛的工厂模拟-----------
玻璃瓶->
青岛啤酒...

三、总结

      后续补充。

猜你喜欢

转载自www.cnblogs.com/fating/p/12578691.html