文档章节

设计模式-工厂模式

BlauHimmel
 BlauHimmel
发布于 2017/03/24 21:43
字数 1051
阅读 21
收藏 1

工厂方法模式(Factory Method)

工厂模式是JAVA中一种最为重要的设计模式之一。这种设计模式是一种创建型模式,提供一种出色的创建对象的方式。

在工厂模式中,我们不会让创建者自己去new,而是通过给工厂下达相应的指令来创建不同的对象。不同的对象都会实现一个共同接口。

实现方法

这里我们以创建形状为例,首先声明一个接口Shape,然后通过实现Shape接口来定义一些具体的Shape,例如矩形,方形和圆形。生产Shape的工厂根据传入的信息(这里使用字符串来表示不同的类型)来进行相应的生产工作。

 

 

第一步:

声明Shape接口

public interface Shape {
   void draw();
}

 

第二步:

创建几个Shape的实现类

public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("画了一个矩形");
   }
}
public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("画了一个方形");
   }
}
public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("画了一个圆形");
   }
}

 

第三步:

建立一个工厂,这个工厂根据给定的信息生产不同的Shape

public class ShapeFactory {
	
   public Shape getShape(String shapeType){

      if(shapeType == null){
         return null;
      }		

      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
         
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
         
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      
      return null;
   }
}

 

第四步:

使用刚刚建立的工厂来创建不同的Shape

public class FactoryPatternDemo {

   public static void main(String[] args) {

      //创建一个生产Shape的工厂
      ShapeFactory shapeFactory = new ShapeFactory();
   
      //生产一个圆形并绘制它
      Shape shape1 = shapeFactory.getShape("CIRCLE");  
      shape1.draw();

      //生产一个矩形并绘制它
      Shape shape2 = shapeFactory.getShape("RECTANGLE");   
      shape2.draw();

      //生产一个方形并绘制它      
      Shape shape3 = shapeFactory.getShape("SQUARE");   
      shape3.draw();
   }
}

 

抽象工厂模式(Abstract Factory)

抽象工厂模式中有一个超级工厂,这个超级工厂负责建造其它的工厂。这个超级工厂又可以叫做工厂的工厂。这种创建型模式提供了一种比前面的工厂方法模式更好的创建对象的方式。

在抽象工厂模式中,有一个接口被用来负责建造生产相关对象的工厂,这样你就不需要像前面这样显示的声明不同的工厂类了。

实现方法

在前面的基础上我们再声明一个接口Color并且定义一些Color的实现类。接下来创建一个抽象工厂AbstractFactory 。生产Shape和Color的工厂ShapeFactory 和ColorFactory 现在都继承自这个抽象工厂AbstractFactory。接下来创建之前说到超级工厂——FactoryProducer 。

超级工厂FactoryProducer 建造其它工厂的方式和工厂生产产品的方式一样,通过传入的字符串信息来进行建造工作。

 

 

第一步:

声明Color接口

public interface Color {
   void fill();
}

 

第二步:

创建几个具体的Color

public class Red implements Color {

   @Override
   public void fill() {
      System.out.println("填上红色");
   }
}
public class Green implements Color {

   @Override
   public void fill() {
      System.out.println("填上绿色");
   }
}
public class Blue implements Color {

   @Override
   public void fill() {
      System.out.println("填上蓝色");
   }
}

 

第三步:

建立新的工厂用来生产Color,并且改造之前的ShapeFactory,让它们都继承自AbstractFactory

public class ShapeFactory extends AbstractFactory {
	
   @Override
   public Shape getShape(String shapeType){
   
      if(shapeType == null){
         return null;
      }		
      
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
         
      }else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
         
      }else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      
      return null;
   }
   
   @Override
   Color getColor(String color) {
      return null;
   }
}
public class ColorFactory extends AbstractFactory {
	
   @Override
   public Shape getShape(String shapeType){
      return null;
   }
   
   @Override
   Color getColor(String color) {
   
      if(color == null){
         return null;
      }		
      
      if(color.equalsIgnoreCase("RED")){
         return new Red();
         
      }else if(color.equalsIgnoreCase("GREEN")){
         return new Green();
         
      }else if(color.equalsIgnoreCase("BLUE")){
         return new Blue();
      }
      
      return null;
   }
}

 

第四步:

定义抽象工厂AbstractFactory

public abstract class AbstractFactory {
   abstract Color getColor(String color);
   abstract Shape getShape(String shape) ;
}

 

第五步:

修建超级工厂

public class FactoryProducer {
   public static AbstractFactory getFactory(String choice){
   
      if(choice.equalsIgnoreCase("SHAPE")){
         return new ShapeFactory();
         
      }else if(choice.equalsIgnoreCase("COLOR")){
         return new ColorFactory();
      }
      
      return null;
   }
}

 

第六步:

使用超级工厂来建造ShapeFactory和ColorFactory,然后进行相应的生产工作

public class AbstractFactoryPatternDemo {
   public static void main(String[] args) {

      //建造生产Shape的工厂
      AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");

      //生产一些Shape并绘制它
      Shape shape1 = shapeFactory.getShape("CIRCLE");
      shape1.draw();

      Shape shape2 = shapeFactory.getShape("RECTANGLE");
      shape2.draw();
      
      Shape shape3 = shapeFactory.getShape("SQUARE");
      shape3.draw();

      //建造生产Color的工厂
      AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");

      //生产一些Color并填上色
      Color color1 = colorFactory.getColor("RED");
      color1.fill();

      Color color2 = colorFactory.getColor("Green");
      color2.fill();

      Color color3 = colorFactory.getColor("BLUE");
      color3.fill();
   }
}

 

© 著作权归作者所有

BlauHimmel
粉丝 0
博文 2
码字总数 2415
作品 0
武汉
程序员
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部