一.什么事工厂设计模式
首先它有简单工厂和抽象工厂之分。但真正算得上设计模式的,是抽象工厂。而简单工厂说实在的仅仅是比较自然的再封装,也就是把new对象过程在工厂里面实现。所以很多教科书会显摆自己的内涵大幅度的介绍抽象工厂,而有意无意的忽略了简单工厂。实际的情况又正好相反,简单工厂几乎每个人都会用得上,抽象工厂大部分人一辈子都用不上一次。还有大部分人认为简单工厂只是new对象的一种包装,其实不然,它还有复杂的用法(例如:隐藏了创建过程的复杂度也就是我们并不需要去了解每个对象的具体作用或方法只用传给工厂自己的参数,让工厂自己去制造和查找符合要求的对象)
二.工厂设计模式的实现.
1.简单工厂
*//首先我们来介绍普通的写法
public interface Product {
public void createproduct();
}
//定义一个类实现接口(也是真正做事的人)
public class Person implements Product {
@Override
public void createproduct() {
System.out.println("做手机。。");
}
}
public class Person2 implements Product {
@Override
public void createproduct() {
System.out.println("做电视。。");
}
}
//写一个工厂类由他来提供要创建什么产品
public class SimpleFactory {
public static Product factory(String productName) throws Exception{
if(productName.equals("手机")){
return new Person();
}else if(productName.equals("电视")){
return new Person2();
}else{
throw new Exception("没有该产品");
}
}
}
//告诉工厂类我的需求(我并不需要知道具体的类和方法只需要告诉工厂要什么产品)
public static void main(String[] args) {
try {
SimpleFactory.factory("手机");
SimpleFactory.factory("电视");
} catch (Exception e) {
e.printStackTrace();
}
}
注意:上面这个普通方法有局限性。首先,我们每次想要增加一种新产品的时候,都必须修改SimpleFactory的原代码。其次,当我们拥有很多很多产品的时候,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增,这对以后的维护简直就是恐怖两个字...,还有就是,整个系统都严重依赖SimpleFactory类,只要SimpleFactory类一出问题,系统就进入不能工作的状态,这也是最为致命的一点....所以我们就用下面的方法
*//定义一个面向接口的实体类
public interface Product {
public void createproduct();
}
//定义一个类实现接口(也是真正做事的人)
public class Person implements Product {
@Override
public void createproduct() {
System.out.println("做手机。。");
}
}
public class Person2 implements Product {
@Override
public void createproduct() {
System.out.println("做电视。。");
}
}
//定义一个面向接口的工厂类
public interface Factory{
public Product create();
}
//创建手机的工厂
public class CreateWasher implements Factory{
public Product create(){
return new Person();
}
}
//创建电视的工厂
public class CreateIcebox implements Factory{
public Product create(){
return new Person2();
}
}
3.抽象工厂
抽象工厂:意图在于创建一系列互相关联或互相依赖的对象 //我们可以为冰箱和洗衣机分别定义两个产品接口,以对他们进行分类,
//洗衣机接口
public interface Washer{
}
//冰箱接口
public interface Icebox{
//洗衣机-A
public class WasherA implements Washer{
public WasherA(){
System.out.println("洗衣机-A被制造了");
}
}
//洗衣机-B
public class WasherB implements Washer{
public WasherB(){
System.out.println("洗衣机-B被制造了");
}
}
//冰箱-A
public class IceboxA implements Icebox{
public IceboxA(){
System.out.println("冰箱-A被制造了");
}
}
//冰箱-B
public class IceboxB implements Icebox{
public IceboxB(){
System.out.println("冰箱-B被制造了");
}
public Washer createWasher();
public Icebox createIcebox();
}
public class FactoryA implements Factory{
//创建洗衣机-A
public Washer createWasher(){
return new WasherA();
}
//创建冰箱-A
public Icebox createIcebox(){
return new IceboxA();
}
}
//创建型号为B的产品工厂
public class FactoryB implements Factory{
//创建洗衣机-B
public Washer createWasher(){
return new WasherB();
}
//创建冰箱-B
public Icebox createIcebox(){
return new IceboxB();
}
}
这样,我们的抽象工厂就完成了。在应用抽象工厂之前,要先对创建的对象进行系统的分类,这点很重要,好的产品分类规则能为具体工厂类的选择调用和以后的扩展提供清晰的思路.
首先它有简单工厂和抽象工厂之分。但真正算得上设计模式的,是抽象工厂。而简单工厂说实在的仅仅是比较自然的再封装,也就是把new对象过程在工厂里面实现。所以很多教科书会显摆自己的内涵大幅度的介绍抽象工厂,而有意无意的忽略了简单工厂。实际的情况又正好相反,简单工厂几乎每个人都会用得上,抽象工厂大部分人一辈子都用不上一次。还有大部分人认为简单工厂只是new对象的一种包装,其实不然,它还有复杂的用法(例如:隐藏了创建过程的复杂度也就是我们并不需要去了解每个对象的具体作用或方法只用传给工厂自己的参数,让工厂自己去制造和查找符合要求的对象)
二.工厂设计模式的实现.
1.简单工厂
*//首先我们来介绍普通的写法
public interface Product {
public void createproduct();
}
//定义一个类实现接口(也是真正做事的人)
public class Person implements Product {
@Override
public void createproduct() {
System.out.println("做手机。。");
}
}
public class Person2 implements Product {
@Override
public void createproduct() {
System.out.println("做电视。。");
}
}
//写一个工厂类由他来提供要创建什么产品
public class SimpleFactory {
public static Product factory(String productName) throws Exception{
if(productName.equals("手机")){
return new Person();
}else if(productName.equals("电视")){
return new Person2();
}else{
throw new Exception("没有该产品");
}
}
}
//告诉工厂类我的需求(我并不需要知道具体的类和方法只需要告诉工厂要什么产品)
public static void main(String[] args) {
try {
SimpleFactory.factory("手机");
SimpleFactory.factory("电视");
} catch (Exception e) {
e.printStackTrace();
}
}
注意:上面这个普通方法有局限性。首先,我们每次想要增加一种新产品的时候,都必须修改SimpleFactory的原代码。其次,当我们拥有很多很多产品的时候,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增,这对以后的维护简直就是恐怖两个字...,还有就是,整个系统都严重依赖SimpleFactory类,只要SimpleFactory类一出问题,系统就进入不能工作的状态,这也是最为致命的一点....所以我们就用下面的方法
*//定义一个面向接口的实体类
public interface Product {
public void createproduct();
}
//定义一个类实现接口(也是真正做事的人)
public class Person implements Product {
@Override
public void createproduct() {
System.out.println("做手机。。");
}
}
public class Person2 implements Product {
@Override
public void createproduct() {
System.out.println("做电视。。");
}
}
//定义一个面向接口的工厂类
public interface Factory{
public Product create();
}
//创建手机的工厂
public class CreateWasher implements Factory{
public Product create(){
return new Person();
}
}
//创建电视的工厂
public class CreateIcebox implements Factory{
public Product create(){
return new Person2();
}
}
3.抽象工厂
抽象工厂:意图在于创建一系列互相关联或互相依赖的对象 //我们可以为冰箱和洗衣机分别定义两个产品接口,以对他们进行分类,
//洗衣机接口
public interface Washer{
}
//冰箱接口
public interface Icebox{
}
接着,我们分别创建这两个接口的具体产品//洗衣机-A
public class WasherA implements Washer{
public WasherA(){
System.out.println("洗衣机-A被制造了");
}
}
//洗衣机-B
public class WasherB implements Washer{
public WasherB(){
System.out.println("洗衣机-B被制造了");
}
}
//冰箱-A
public class IceboxA implements Icebox{
public IceboxA(){
System.out.println("冰箱-A被制造了");
}
}
//冰箱-B
public class IceboxB implements Icebox{
public IceboxB(){
System.out.println("冰箱-B被制造了");
}
}
到此,产品部分我们准备好了,接下来我们来处理工厂部分,我们先来定义工厂行为接口
public interface Factory{public Washer createWasher();
public Icebox createIcebox();
}
接下来我创造具体的工厂类,我们根据上面产品的接口,把型号A的产品分为一类,由一个工厂来管理,把型号为B的产品有另一个工厂管理,根据这个分类,我们可以实现如下的两个具体工厂类
//创建型号为A的产品工厂public class FactoryA implements Factory{
//创建洗衣机-A
public Washer createWasher(){
return new WasherA();
}
//创建冰箱-A
public Icebox createIcebox(){
return new IceboxA();
}
}
//创建型号为B的产品工厂
public class FactoryB implements Factory{
//创建洗衣机-B
public Washer createWasher(){
return new WasherB();
}
//创建冰箱-B
public Icebox createIcebox(){
return new IceboxB();
}
}
这样,我们的抽象工厂就完成了。在应用抽象工厂之前,要先对创建的对象进行系统的分类,这点很重要,好的产品分类规则能为具体工厂类的选择调用和以后的扩展提供清晰的思路.