工厂模式&策略模式。

抽象、封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理。(百度百科)

不断抽象封装,让复杂事物变得简单,以便于让我们的大脑能够进行处理。

我记得有那么一天,小吴带着女朋友去城西银泰买手机,他们走进一家小米手机店,对卖家(seller)说:“给我一部小米的手机看看?”卖家心里想:“废话,在小米店里,我还能卖苹果手机给你啊!直接说手机呀”

在C语言面向过程下,我们编程就是这样的,必须把每一个过程单独出来,但是在面向对象编程中就可以避免。

1、简单工厂模式:我(客户端)不需要直接创建对象,只需要负责消费。面向对象强调的是开闭原则,对扩展开放,对修改关闭。

当我需要买苹果手机的时候,代码是不需要修改的,当我增加一种新手机类型的时候,部分代码需要改动,需要继承Phone类,工厂要增加逻辑的判断。

综上,当具体产品比较少增加,业务比较简单的时候可以用简单工厂模式。

public class WuSimpleFactory {

public static void main(String[] args) {
//我告诉店员买小米,工厂创建小米手机的实例
Phone phone = Seller.creatPhone("XiaoMi");
//手机根据类型说不同的话
phone.setName("XiaoMi");
phone.sell();
}

}

//抽象产品
abstract class Phone{
private String name;

public abstract void sell();

public String getName() {
return name;
}

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

//具体产品,根据手机不同,卖家说不同的话
class XiaoMi extends Phone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

class Apple extends Phone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

//简单工厂
class Seller{
public static Phone creatPhone(String phoneType){
Phone phone = null;
if(phoneType.equals("XiaoMi")){
phone = new XiaoMi();
}
if(phoneType.equals("Apple")){
phone = new Apple();
}
return phone;
}
}

2、工厂模式

我们发现简单工厂模式没有完全符合开闭原则,当增加新的具体产品时,需要修改原先的代码,及工厂模块需要增加逻辑,那么我们可以将工厂也抽象出一个抽象工厂。

相当于,不直接找小米或者苹果的店员,先找他们共同的经理,通过经理去管理各个手机店员就好了。

package com.enjoyor.soa.traffic.server.tms.util;

public class WuSimpleFactory {

public static void main(String[] args) {
//我告诉店员买小米,工厂创建小米手机的实例
Seller sell = new XiaoMiSeller();
//手机根据类型说不同的话
Phone phone = sell.creatPhone();
phone.setName("XiaoMi");
phone.sell();
}

}

//抽象产品
abstract class Phone{
private String name;

public abstract void sell();

public String getName() {
return name;
}

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

//具体产品,根据手机不同,卖家说不同的话
class XiaoMi extends Phone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

class Apple extends Phone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

//工厂
abstract class Seller{
public abstract Phone creatPhone();
}

class XiaoMiSeller extends Seller{
@Override
public Phone creatPhone() {
return new XiaoMi();
}
}

class AppleSeller extends Seller{
@Override
public Phone creatPhone() {
return new Apple();
}}

3、使用工厂模式已经完全符合开闭原则,当增加新的具体产品时不用修改任何原先的代码,只需要分别继承抽象产品类和抽象工厂类即可。基本上能满足大部分的业务需求,但是当手机分型号(产品族)的时候,也就是说,小米手机里面又继续分小米1和小米2的时候,就需要单独定义小米手机的抽象产品里面,用于不同型号的小米手机进行继承。

比如:

//抽象产品
abstract class XiaoMiPhone{
private String name;

public abstract void sell();

public String getName() {
return name;
}

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

//省略

4、策略模式

策略模式和工厂模式十分类似,只是强调的封装不同。

package com.enjoyor.soa.traffic.server.tms.util;

public class WuSimpleFactory {
//策略模式:内行顾客,知道手机的所有细节,已经将手机实例化了,只是需要工厂处理一下
public static void main(String[] args) {
XiaoMiPhone phone = new XiaoMi1();
phone.setName("mi1");
//传进参数是在客户端已经实例化好的实例
phoneContext context = new phoneContext(phone);
context.sell();

}

}

//抽象产品
abstract class XiaoMiPhone{
private String name;

public abstract void sell();

public String getName() {
return name;
}

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

//具体产品,根据手机不同,卖家说不同的话
class XiaoMi1 extends XiaoMiPhone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

class XiaoMi2 extends XiaoMiPhone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

//工厂
class phoneContext{
XiaoMiPhone phone = null;
public phoneContext (XiaoMiPhone phone){
this.phone = phone;
}

public void sell(){
this.phone.sell();
}
}

~~~~~~~~~~~~~~~~

package com.enjoyor.soa.traffic.server.tms.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class WuSimpleFactory {
//工厂模式:外行顾客,不知道手机具体,只知道一个手机名字
public static void main(String[] args) throws IOException {
System.out.println("请输入你要购买的手机");
String phoneName = new BufferedReader(new InputStreamReader(System.in)).readLine();

XiaoMiPhone phone = phoneContext.creatPhone(phoneName);
phone.setName("mi1");
phone.sell();
}

}

//抽象产品
abstract class XiaoMiPhone{
private String name;

public abstract void sell();

public String getName() {
return name;
}

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

//具体产品,根据手机不同,卖家说不同的话
class XiaoMi1 extends XiaoMiPhone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

class XiaoMi2 extends XiaoMiPhone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

//工厂
class phoneContext{
public static XiaoMiPhone creatPhone(String type) {
XiaoMiPhone phone = null;
if("mi1".equalsIgnoreCase(type)){ //不区分大小写
phone = new XiaoMi1();
}
if("mi2".equalsIgnoreCase(type)){
phone = new XiaoMi2();
}
return phone;
}
}

文章参考 : http://www.cnblogs.com/ZSG-DoBestMe/p/5175761.html

上一篇:wireshark 根据域名筛选


下一篇:C实现dos图文菜单程序实例