设计模式(三种)简单工厂,工厂模式,抽象工厂
由于现阶段认识有限,只能谈谈我的理解,代码以后补充
1简单工厂:
专门定义一个类用来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
其实就是声明了一个简单的类作为一个工厂,用里面的creat()方法来实现(里面可以用if,switch等语句简单的实现)
public class HaoSyFactory {
public static final int ID_LZLM = 1;//兰州拉面
public static final int ID_PM = 2;//泡面
public static final int ID_WHRGM = 3;//武汉热干面
public static INoodles createNoodles(int ID) {
switch (ID) {
case ID_LZLM:
return new Lzlm();//拉面类
case ID_PM:
return new PaoNoodles();//泡面类
case ID_WHRGM:
default:
return new WuhanNoodles();//热干面类
}
}
}
简单工厂:
特点
它是一个具体的类 ,不是接口 ,也不是抽象类。有一个重要的create()方法,利用if或者 switch创建产品并返回。
create()方法通常是静态的,所以也称之为静态工厂。
缺点
扩展性差(我想增加一种面条,除了新增一个面条产品类,还需要修改工厂类方法,还要在添加一个类)
不同的产品需要不同额外参数的时候 不支持。
俗话说嘛,你不完美,那就有比你厉害完美点的呀。接下来我们看下工厂方法模式。
2工厂方法:
概念:
定义一个用于创建对象的接口,让子类觉得实例化哪一个类,使一个类的实例化延迟到其子类。
作用
在一定程度上解耦(减少了依赖性),消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产品实现类如何改动与消费者完全无关。
可以一定程度增加扩展性,若增加一个产品实现,只需要实现产品接口,修改工厂创建产品的方法,消费者可以无感知
(个人感觉:其实我感觉这种工厂就是把实现方法转移到子类,从而减少了依赖性,他只是到自己的子类中实现其功能,那个工厂只是形式,不像简单工厂那样依赖工厂很高。)
这个代码还不太理解,日后补充
3抽象方法:
提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。
优缺点:
抽象工厂模式的优点
抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。
抽象工厂模式的缺点
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
interface IProduct1 {
public void show();
}
interface IProduct2 {
public void show();
}
class Product1 implements IProduct1 {
public void show() {
System.out.println("这是1型产品");
}
}
class Product2 implements IProduct2 {
public void show() {
System.out.println("这是2型产品");
}
}
interface IFactory {
public IProduct1 createProduct1();
public IProduct2 createProduct2();
}
class Factory implements IFactory{
public IProduct1 createProduct1() {
return new Product1();
}
public IProduct2 createProduct2() {
return new Product2();
}
}
public class Client {
public static void main(String[] args){
IFactory factory = new Factory();
factory.createProduct1().show();
factory.createProduct2().show();
}
}
使用场景:
这种工厂主要适用于一些产品之间具有相互依赖或相互关联的产品时才会使用,以及就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。
最后一问:利用工厂模式的目的是什么呢?是解耦呀。对的,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了就OK。
(个人认为,抽象工厂就是用一堆的接口和一堆的类来实现,从而降低耦合性,其之间(就上面的例子)感觉依赖性不强从而实现自己想要的功能)