您的位置 首页 java

设计模式之工厂模式


1 简单工厂模式

工厂1

1.1简单工厂模式的定义

简单工厂模式是由有一个工厂类去创建同一类型的实例,不同的实例通过类型去控制。怎么理解了,这就好比一家代工电视机的工厂,这个工厂只能代工 小米 电视,这个工厂可以生产40寸、55寸、60寸、80寸的电视,假如小米需要60寸的电视,这个工厂的流水线就把60寸的电视生产出来,只需要一个类型指令就可以了。这样说只是一个简化,实际生产过程中相当的复杂,设计供应链、订单、交付等各个环节,只是打个比方。

简单工厂模式也称之为静态工厂模式,一个工厂类提供一个 静态方法 ,生成同一系列的产品。简单工厂之所以称之为简单,是由于写法上简单,工厂生产的类型单一。

1.2 简单工厂模式解决的问题

  • 遵循单一职能设计原则, 创建与使用分离,使用者无需关注创建的细节,只需要遵循公共的定义即可。
  • 是工厂方法与抽象工厂模式的简单实现,对业务场景变化很少的场景很适用。

1.3简单工厂模式存在的问题

  • 违背开闭原则,新增业务场景,需要修改工厂类
  • 由于是静态方法,没有办法继承扩展

1.4 简单工厂的实例

1). 创建流程

①定义创建实例的 抽象类 或接口

②实现抽象类或接口

③实现工厂类创建实例对象

简单工厂创建流程

2) . 简单工厂示例,一个简单的例子说明简单工厂的用法

①.定义抽象类

public 
abstract class Employee {

 private int id;

 private String name;
 //抽象行为,所有示例的公有行为
 public abstract void action();

 public int getId() {
 return id;
 }

 public void setId(int id) {
 this.id = id;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }
} 

② 实现抽象类

A. 程序员实现类

public
class Programmer 
 extends Employee {
 @ Override 
 public void action() {
 System.out.println(getName() + "苦逼的程序员正在写bug~");
 }
} 

B. 销售的实现类

public class Saler extends Employee {
 @Override
 public void action() {
 System.out.println(getName() + "我正在与客户沟通~~");
 }
} 

③实现简单工厂

public class Simple factory  {
 /**
 * 通过参数,控制创建的具体的实例对象,返回的是抽象的类
 * @param type
 * @return
 */ public static Employee createEmployee(String type){
 if(type.equals("programmer")){
 return new Programmer();
 }
 else if(type.equals("saler")){
 return new Saler();
 }
 return null;
 }
} 

这样我们的简单工厂就实现完成了, 当然写法上根据自身的实际情况而定,但是主要的思想是不变的。


2.抽象工厂模式

2.1抽象工厂模式的定义

抽象工厂模式是提供一组创建相关联的产品簇的一种方法模式。是对工厂方法模式的一种改进,工厂方法模式中一个具体工厂只能创建一种产品,在有些场景下显得比较繁琐,抽象工厂模式为解决这一问题而存在。

2.2抽象工厂模式的实现

抽象工厂模式的实现过程与工厂方法模式很相似,不同的是工厂中提供了多种创建方法

创建的步骤请参照工厂方法模式,在此给一个实例说明;

① 定义抽象工厂

public interface Factory {
/**
* 创建销售
* @return
*/
Employee createSaler();
/**
* 创建程序员
* @return
*/
public Employee createProgrammer();
}

② 实现抽象工厂

public class AbstratoryFactory implements Factory{

 private AbstratoryFactory(){}
 /**
 * 创建销售
 * @return
 */ @Override
 public Employee createSaler(){
 return new Saler();
 }

 /**
 * 创建程序员
 * @return
 */ @Override
 public Employee createProgrammer(){
 //也是初始化一些参数
 return new Programmer();
 }
} 

③ 定义抽象实例

public abstract class Employee {
 private int id;
 private String name;
 public abstract void action();
 public int getId() {
 return id;
 }
 
 public void setId(int id) {
 this.id = id;
 }
 
 public String getName() {
 return name;
 }
 
 public void setName(String name) {
 this.name = name;
 }
} 

④ 实现抽象实例

 public class Programmer 
 extends Employee {
 
 @Override
 public void action() {
 System.out.println(getName() + "苦逼的程序员正在写bug~");
 }
} 
public class Saler 
 extends Employee {
 
 @Override
 public void action() {
 System.out.println(getName() + "我正在与客户沟通~~");
 }
} 

3.工厂方法模式

3.1、工厂方法模式的定义

工厂方法模式是定义一个创建实例的接口,真实创建实例由子工厂类去做。工厂方法摸式是对简单工厂模式的扩展与改进,弥补了简单工厂模式扩展不足的问题。

工厂方式模式与简单工厂模式一样,只能创建同一类型的产品,因为工厂实现类遵循同一的接口。

3.2、工厂方法模式的有点

  • 什么产品用什么工厂创建,非常明确,只需要知道是要创建什么样的产品,也就明白了需要用什么工厂去创建,通过名称约定去实现,遵循同一的规则
  • 系统增加新的产品,只需要增加具体的产品类与具体的子工厂,而无需对原工厂修改,这解决了简单工厂中违背“开闭原则“的问题

3.3、工厂方法模式的缺点

每增加一种产品,必须得增加这类型的工厂,增加了系统的复杂度,如果产品很多,会有很多的工厂,很多的类,管理维护差。

3.4、工厂方法模式示例

1). 结构示例图

① 定义抽象工厂;提供所有子工厂的同一定义接口,对象提供一个创建的方法

② 具体工厂;对每个产品的生产的具体工厂,继承抽象工厂

③ 抽象产品;同一的产品类定义

④ 具体的产品

工厂方法模式结构

说明:图片来自

2). 工厂方法模式示例

① 抽象工厂的定义

public interface AbstractFactory { 
 /** * 创建对象 
 * @return */ 
 Employee create();
} 

②具体工厂的定义

public class PragrammerFactory 
 implements AbstractFactory {
 @Override
 public Employee create() {
 return new Programmer();
 }
} 
public class SalerFactory 
 implements AbstractFactory {
 @Override
 public Employee create() {
 return new Saler();
 }
} 

③抽象产品的定义

public abstract class Employee {
 private int id;
 private String name;
 public abstract void action();
 public int getId() {
 return id;
 }
 public void setId(int id) {
 this.id = id;
 }
 public String getName() {
 return name;

 }
 public void setName(String name) {
 this.name = name;
 }
} 

④具体产品的实现

public class Programmer extends Employee {
 @Override
 public void action() {
 System.out.println(getName() + "苦逼的程序员正在写bug~");
 }
} 
public class Saler extends Employee {
 @Override
 public void action() {
 System.out.println(getName() + "我正在与客户沟通~~");
 }
} 

工厂方法模式到这儿就完成了,是不是很简单,怎么用的话,有各种变形,我在这个举一个例子,看看

public class Factory 
 implements AbstractFactory {
 private AbstractFactory factory;
 public Factory(AbstractFactory factory){
 this.factory = factory;
 }
 @Override
 public Employee create() {
 System.out.println("这是一个装饰模式的factory,可用性更强");
 return factory.create();
 }
} 

以统一工厂去创建,具体工厂作为参数,这利用装饰模式去实现,我觉得这样用还不错。

4 结语

工厂模式是为创建对象而存在,对于反复的创建形同类型的对象,提供一种统一的创建模式,减少代码的重复,提高抽象性与可维护性。

文章来源:智云一二三科技

文章标题:设计模式之工厂模式

文章地址:https://www.zhihuclub.com/186228.shtml

关于作者: 智云科技

热门文章

网站地图