与工厂相关的的三个设计模式 2020-11-08 15:03:29
简单工厂模式:说白就是,间接脱离了new 创建对象,而是直接从工厂中获得对象。
简单工厂:不是用new创建对象,而是将创建对象这一过程集中放在了工厂中,这样便于维护修改创建过程;也实现了调用创建对象和对象之间的解耦。
话不多说,先了解一下如下UML类图:
汽车类 package com.yuan.factory.simple;
public abstract class Car {
public abstract void getname();
}
大众汽车类
package com.yuan.factory.simple;
public class Dazong extends Car {
@Override public void getname() { System.out.println("大众"); } }
特斯拉汽车类
package com.yuan.factory.simple;
public class Tsla extends Car { @Override public void getname() { System.out.println("特斯拉"); } }
汽车工厂类
package com.yuan.factory.simple;
public class CarFactory {
public static Car getTsla(){ return new Tsla(); }
public static Car getDazong(){ return new Dazong(); }
}
客户类
package com.yuan.factory.simple;
public class Customer { public static void main(String[] args) { CarFactory carFactory = new CarFactory(); carFactory.getTsla().getname(); carFactory.getDazong().getname(); } }
|
工厂方法模式:
由于简单工厂模式,不满足“对扩展开放,对修改关闭”原则,所以说,就出现了工厂方法模式。那么工厂方法模式就是在简单工厂模式上,对每个子类建立一个工厂,因此实现扩展性,遵循上述原则。
汽车接口 package com.yuan.factory.method;
public interface Car {
void getname(); }
大众汽车类
package com.yuan.factory.method;
public class Dazong implements Car { @Override public void getname() { System.out.println("大众"); } } 特斯拉汽车类
package com.yuan.factory.method;
public class Tsla implements Car { @Override public void getname() { System.out.println("特斯拉"); } }
汽车工厂接口
package com.yuan.factory.method;
public interface CarFactory {
Car getCar(); } 大众汽车工厂
package com.yuan.factory.method;
public class DazongFactory implements CarFactory {
@Override public Car getCar() { return new Dazong(); } }
特斯拉汽车工厂
package com.yuan.factory.method;
public class TslaFactory implements CarFactory{
@Override public Car getCar() { return new Tsla(); } }
客户类
package com.yuan.factory.method;
public class Customer {
public static void main(String[] args) { new DazongFactory().getCar().getname(); new TslaFactory().getCar().getname(); } }
|
抽象工厂模式:
产品族:由同一家产品生产厂家生产的不同类型产品。
同一产品类型:略...略...略
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
先了解一些第一张UML图:
请仔细看这个UML类图:如下图。产品工厂生产其他子工厂:华为工厂和小米工厂。Demo测试用类直接使用子工厂。
在此图中抽象工厂就是管理其他子工厂,是子工厂的进一步抽象。
抽象工厂类 package com.yuan.factory.abstract1; //抽象产品工厂 public interface IProductFactory {
//生产手机 IphoneProduct iPhoneProduct(); //生产路由器 IRouterProduct iRouterProduct();
}
抽象工厂子工厂: 1.华为工厂类
package com.yuan.factory.abstract1;
/** * 华为抽象工厂 华为产品族 */ public class HUAWeiFactory implements IProductFactory { @Override public IphoneProduct iPhoneProduct() { return new HuaweiPhone(); }
@Override public IRouterProduct iRouterProduct() { return new HuaweiRouter(); } }
2.小米工厂类
package com.yuan.factory.abstract1;
/** * 小米的抽象工厂 */ public class XiaomiFactory implements IProductFactory { @Override public IphoneProduct iPhoneProduct() { return new XiaomiPhone(); }
@Override public IRouterProduct iRouterProduct() { return new XiaomiRouter(); } }
手机接口
package com.yuan.factory.abstract1;
//手机产品接口 public interface IphoneProduct {
void start(); void shutdown(); void callup(); void sendMessage(); }
路由器接口
package com.yuan.factory.abstract1;
//路由器 public interface IRouterProduct {
void start(); void shutdown(); void openWifi(); void setting(); }
手机实现类: 1.华为手机类
package com.yuan.factory.abstract1; //华为手机 public class HuaweiPhone implements IphoneProduct{
@Override public void start() { System.out.println("开启华为手机"); }
@Override public void shutdown() { System.out.println("关闭华为手机"); }
@Override public void callup() { System.out.println("华为手机打电话"); }
@Override public void sendMessage() { System.out.println("华为手机发短信"); } }
2.小米手机类
package com.yuan.factory.abstract1; //小米手机 public class XiaomiPhone implements IphoneProduct{
@Override public void start() { System.out.println("开启小米手机"); }
@Override public void shutdown() { System.out.println("关闭小米手机"); }
@Override public void callup() { System.out.println("小米打电话"); }
@Override public void sendMessage() { System.out.println("小米发短信"); } }
路由器实现类 1.华为路由器
package com.yuan.factory.abstract1;
public class HuaweiRouter implements IRouterProduct { @Override public void start() { System.out.println("华为路由器开启"); }
@Override public void shutdown() { System.out.println("华为路由器关闭"); }
@Override public void openWifi() { System.out.println("打开华为wifi"); }
@Override public void setting() { System.out.println("配置华为路由器"); } }
2.小米路由器
package com.yuan.factory.abstract1;
public class XiaomiRouter implements IRouterProduct { @Override public void start() { System.out.println("小米路由器打开"); }
@Override public void shutdown() { System.out.println("小米路由器关闭"); }
@Override public void openWifi() { System.out.println("打开小米wifi"); }
@Override public void setting() { System.out.println("配置小米路由器"); } }
|