前言
-
设计模式来源?
设计模式来自于建筑领域,作为软件工程的一个分支。1995年由GOF收集整理了23种设计模式并出版了《Design Patterns: Elements of Reusable Object-Oriented Software》一书。 -
什么是设计模式?
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 -
为什么要使用设计模式(目的)?
为了代码可重用性、增加可维护性,让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化。 -
怎么实现代码可重用性?
遵循设计模式七大原则(单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特法则、合成/聚合复用原则)。
提示:以下是本篇文章正文内容,下面案例可供参考
一、工厂方法
又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。一种常用的对象创建型设计模式,此模式的核心精神是封装 类中不变的部分。
1、主要角色
- 抽象工厂:描述具体工厂的公共接口
- 具体工厂:描述具体工厂,创建产品的实例,供外界调用
- 抽象产品:负责描述产品的公共接口
- 具体产品:描述生产的具体产品
2、简单示例
举个简单易懂的例子:“假设”有生产苹果手机的加工厂(抽象工厂),可以生产出苹果5手机(抽象产品)。苹果5手机加工厂(具体工厂),只能生产内存32、64G的苹果5手机(具体产品)。
3、代码如下(示例):
产品
/**
* 抽象产品-苹果手机
*/
public abstract class Iphone {
public abstract void produce();
}
/**
* 具体产品-苹果手机
*/
public class Iphone_5_32G extends Iphone {
@Override
public void produce() {
System.out.println("生产一台苹果5-32G");
}
}
public class Iphone_5_32G extends Iphone {
@Override
public void produce() {
System.out.println("生产一台苹果5-32G");
}
}
工厂
代码如下(示例):
//抽象工厂
public abstract class AbFactory {
public abstract Iphone getProduct();
}
//具体工厂
public class Phone_5_32G_Factory extends AbFactory{
@Override
public Iphone getProduct() {
return new Iphone_5_32G();
}
}
//具体工厂
public class Phone_5_64G_Factory extends AbFactory{
@Override
public Iphone getProduct() {
return new Iphone_5_64G();
}
}
测试
public class Test {
public static void main(String[] args) {
AbFactory phone_5=new Phone_5_32G_Factory();
phone_5.getProduct().produce();
AbFactory phone_6=new Phone_5_64G_Factory();
phone_6.getProduct().produce();
}
}
生产一台苹果5-32G
生产一台苹果5-64G
二、抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。
1、主要角色
- 抽象工厂:描述具体工厂的公共接口
- 具体工厂:描述具体工厂,创建产品的实例,供外界调用
- 抽象产品族:描述抽象产品的公共接口
- 抽象产品:描述具体产品的公共接口
- 具体产品:具体产品
2、简单示例
“假设”有各类的手机加工厂(抽象工厂),可以出售各类手机,如苹果手机(抽象产品族)。有苹果5,苹果6(抽象产品),比如常见的富士康(具体工厂),出售32G、64G内存(具体产品)。
3、代码如下(示例):
产品
/**
* 抽象产品族
*/
public abstract class Iphone {
public abstract void produce();
}
//抽象产品
public abstract class Phone_5 extends Iphone {
@Override
public abstract void produce();
}
public abstract class Phone_6 extends Iphone {
@Override
public abstract void produce();
}
/**
* 具体产品-苹果手机
*/
public class Phone_5_32G extends Phone_5 {
@Override
public void produce(){
System.out.println("生产一台苹果5-32G");
}
}
public class Phone_5_64G extends Phone_5 {
@Override
public void produce(){
System.out.println("生产一台苹果5-64G");
}
}
public class Phone_6_32G extends Phone_6 {
@Override
public void produce(){
System.out.println("生产一台苹果6-32G");
}
}
public class Phone_6_64G extends Phone_6 {
@Override
public void produce(){
System.out.println("生产一台苹果6-64G");
}
}
工厂
代码如下(示例):
//抽象工厂
public abstract class Factory {
public abstract Iphone getIphone_32G();
public abstract Iphone getIphone_64G();
}
//具体工厂
public class Phone_5_Factory extends Factory {
@Override
public Iphone getIphone_32G() {
return new Phone_5_32G();
}
@Override
public Iphone getIphone_64G() {
return new Phone_5_64G();
}
}
//具体工厂
public class Phone_6_Factory extends Factory {
@Override
public Iphone getIphone_32G() {
return new Phone_6_32G();
}
@Override
public Iphone getIphone_64G() {
return new Phone_6_64G();
}
}
测试
public class Test {
public static void main(String[] args) {
//抽象工厂
Factory factory_5=new Phone_5_Factory();
factory_5.getIphone_32G().produce();
factory_5.getIphone_64G().produce();
Factory factory_6=new Phone_6_Factory();
factory_6.getIphone_32G().produce();
factory_6.getIphone_64G().produce();
}
}
生产一台苹果5-32G
生产一台苹果5-64G
生产一台苹果6-32G
生产一台苹果6-64G
总结
工厂方法:抽象工厂、具体工厂、抽象产品、具体产品
抽象工厂:抽象工厂、具体工厂、抽象产品族、抽象产品、具体产品
工厂方法:定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。
工厂方法模式解决了简单工厂模式的“开放 - 关闭原则
抽象工厂模式解决了工厂方法模式一个具体工厂只能创建一类产品